2022考纲新增知识点汇总
数据结构
计算机组成原理
操作系统
文件管理
文件
- 文件的打开操作(2014年真题)
- 元数据,vfs的拓展阅读
文件的逻辑结构: $\color{red}{\text{文件元数据}}$ 和索引节点(inode)
目录
$\color{red}{\text{目录的操作}}$
文件系统
$\color{red}{\text{文件系统的全局结构}}$ (layout)(文件系统在外存中的结构,文件系统在内存中的结构)
- 文件系统在内存中的结构(2017年真题,打开fd1,fd2)
$\color{red}{\text{虚拟文件系统}}$
$\color{red}{\text{文件系统挂载}}$ (mounting)
计算机网络
阿里云
gulimall
2020三篇400集完整版-谷粒电商-谷粒商城-基础篇+高级篇+架构篇-雷丰阳-雷神-springboot-分布式高级 BV1rK4y1C7fv
- 2021.10.4 bug:p74功能异常
p1 01、简介-项目介绍
笔记
- devops
- 参数化构建+手工
- jenkins
图片详情

疑问
bug
弹幕
p2 02、简介-项目整体效果展示
笔记
疑问
bug
弹幕
p3 03、简介-分布式基础概念
笔记
- 集群是物理概念
- 分布式,相当于集群实现同一个业务
常见负载均衡算法
- 轮询
- 最小连接
配置中心
- 从配置中心获得配置
服务熔断
- 遇到错误直接不调用微服务
服务降级
- 停止运行某些非必须服务
api网关
疑问
bug
弹幕
p4 04、简介-项目微服务架构图
笔记
疑问
bug
弹幕
p5 05、简介-项目微服务划分图
笔记
图片详情

疑问
bug
弹幕
p6 06、环境-使用vagrant快速创建linux虚拟机
笔记
修改机器存储的路径
图片详情

关机
vagrant halt
疑问
bug
VT-x is disabled in the BIOS for all CPU modes
代码详情
1 | Microsoft Windows [版本 10.0.19043.1165] |
打开资源管理器一看果然没有开启虚拟化
资源管理器中cpu的配置

华硕主板的设置方式

设置完之后就成功启动了
1 | Microsoft Windows [版本 10.0.19043.1165] |
弹幕
p7 07、环境-虚拟机网络设置
笔记
疑问
bug
弹幕
p8 08、环境-linux安装docker
笔记
设置自动启动
docker update mysql --restart=always
疑问
bug
无法换源
需要添加nameserver
代码详情
1 |
|
弹幕
p9 09、环境-配置docker阿里云镜像加速
笔记
代码详情
1 | sudo mkdir -p /etc/docker |
疑问
bug
弹幕
p10 10、环境-docker安装mysql
笔记
安装mysql
1 | docker run -p 3306:3306 --name mysql \ |
``
通过容器的 mysql 命令行工具连接
docker exec -it mysql mysql -uroot -proot
文件挂载+端口映射
修改配置
vi /mydata/mysql/conf/my.cnf
代码详情
1 | [client] |
疑问
bug
无法连接mysql
图片详情

使用固定ip需要使用vagrant reload重启虚拟机
但发现不能正确重启
代码详情
1 | Microsoft Windows [版本 10.0.19043.1165] |
图片详情

接下来可以成功启动
代码详情
1 | Microsoft Windows [版本 10.0.19043.1165] |
docker start重启容器
代码详情
1 | D:\big\centos>vagrant ssh |
弹幕
p11 11、环境-docker安装redis
笔记
创建实例
mkdir -p /mydata/redis/conf
echo 'appendonly yes' > /mydata/redis/conf/redis.conf
创建实例
1 | docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \ |
疑问
bug
弹幕
p12 12、环境-开发工具&环境安装配置
笔记
java环境老早就配好了
代码详情
1 | Microsoft Windows [版本 10.0.19043.1165] |
idea安装mybatisx和lombok插件
开启run-dash board(建议ide配置全局maven环境,否则每一个项目都要重新配置maven环境)
疑问
bug
弹幕
p13 13、环境-配置git-ssh
笔记
疑问
bug
弹幕
p14 14、环境-项目结构创建&提交到码云
笔记
疑问
bug
弹幕
p15 15、环境-数据库初始化
笔记
一般不做外键,不然十分耗费数据库性能
疑问
bug
办法正确创建
代码详情
1 | ) ENGINE = InnoDB AUTO_INCREMENT = 53 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '订单' ROW_FORMAT = Dynamic |
弹幕
p16 16、快速开发-人人开源搭建后台管理系统
笔记
疑问
bug
NPM -I失败
代码详情
1 | 56976 warn optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents): |
加参数--unsafe-perm
2021年了,还用python2是什么鬼啊
图片详情

安装sass还是失败
最终解决方案:升级sass的版本参考文献
话说这个项目一年都没有维护了
弹幕
p17 17、快速开发-逆向工程搭建&使用
笔记
记得在每个微服务的pom中引入common !
注意dependcy是加到dependencies里面不是加到dependencyManagement里面
http请求的包:apache http component
引入servlet的时候加入<scope>provided</scope>,springboot自带servlet,打包的时候就不用加入了
疑问
bug
导入mybatis-plus的时候出现的bug
最新的官方文档
version给的是这个东西<version>mybatis-plus-latest-version</version>
实测会报错,改为<version>3.2.0</version>
代码详情
1 | Could not find artifact com.baomidou:mybatis-plus:pom:mybatis-plus-latest-version in central |
spring-boot-maven-plugin报红
图片详情

指定版本:<version>2.3.0.RELEASE</version>
longbok报错
代码详情
1 | D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-product\src\main\java\com\atguigu\gulimall\product\entity\UndoLogEntity.java:42:13 |
图片详情

启动不了vagrant
代码详情
1 | Microsoft Windows [版本 10.0.19043.1165] |
弹幕
p18 18、快速开发-配置&测试微服务基本CRUD功能
笔记
controller的基本结构是:模块名+表名
http://localhost:8080/coupon/coupon/list
疑问
bug
找不到符号 符号: 类 Longblob
在properties加一个映射
图片详情

找不到主类
这个突然变成5也是很莫名其妙
图片详情

这里的maven地址也变了
图片详情

完整信息
代码详情
1 | "D:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=4250:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-ware\target\classes;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.5.4\spring-boot-starter-web-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter\2.5.4\spring-boot-starter-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot\2.5.4\spring-boot-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.4\spring-boot-autoconfigure-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.5.4\spring-boot-starter-logging-2.5.4.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-classic\1.2.5\logback-classic-1.2.5.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-core\1.2.5\logback-core-1.2.5.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;D:\Users\LND\.m2\repository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;D:\Users\LND\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Users\LND\.m2\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.5.4\spring-boot-starter-json-2.5.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.4\jackson-databind-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.4\jackson-annotations-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.4\jackson-core-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.4\jackson-datatype-jdk8-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.4\jackson-datatype-jsr310-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.4\jackson-module-parameter-names-2.12.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.4\spring-boot-starter-tomcat-2.5.4.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.52\tomcat-embed-core-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.52\tomcat-embed-el-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.52\tomcat-embed-websocket-9.0.52.jar;D:\Users\LND\.m2\repository\org\springframework\spring-web\5.3.9\spring-web-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-beans\5.3.9\spring-beans-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-webmvc\5.3.9\spring-webmvc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-aop\5.3.9\spring-aop-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-context\5.3.9\spring-context-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-expression\5.3.9\spring-expression-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-openfeign\3.0.3\spring-cloud-starter-openfeign-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter\3.0.3\spring-cloud-starter-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-context\3.0.3\spring-cloud-context-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.0.3\spring-cloud-openfeign-core-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.5.4\spring-boot-starter-aop-2.5.4.jar;D:\Users\LND\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;D:\Users\LND\.m2\repository\commons-fileupload\commons-fileupload\1.4\commons-fileupload-1.4.jar;D:\Users\LND\.m2\repository\commons-io\commons-io\2.2\commons-io-2.2.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-commons\3.0.3\spring-cloud-commons-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-crypto\5.5.2\spring-security-crypto-5.5.2.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-core\10.12\feign-core-10.12.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-slf4j\10.12\feign-slf4j-10.12.jar;D:\Users\LND\.m2\repository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-common\target\classes;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.2.0\mybatis-plus-boot-starter-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus\3.2.0\mybatis-plus-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-extension\3.2.0\mybatis-plus-extension-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-core\3.2.0\mybatis-plus-core-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-annotation\3.2.0\mybatis-plus-annotation-3.2.0.jar;D:\Users\LND\.m2\repository\com\github\jsqlparser\jsqlparser\2.1\jsqlparser-2.1.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis-spring\2.0.2\mybatis-spring-2.0.2.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.5.4\spring-boot-starter-jdbc-2.5.4.jar;D:\Users\LND\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jdbc\5.3.9\spring-jdbc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-tx\5.3.9\spring-tx-5.3.9.jar;D:\Users\LND\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore\4.4.14\httpcore-4.4.14.jar;D:\Users\LND\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\Users\LND\.m2\repository\mysql\mysql-connector-java\8.0.26\mysql-connector-java-8.0.26.jar;D:\Users\LND\.m2\repository\org\springframework\spring-core\5.3.9\spring-core-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jcl\5.3.9\spring-jcl-5.3.9.jar" com.atguigu.gulimall.ware.GulimallWareApplication |
cannot reconnect
relative path
cache restart未解决
图片详情

renrenfast出现问题
调整lombok版本
参考文献
弹幕
p19 19、快速开发-逆向生成所有微服务基本CRUD代码
笔记
疑问
bug
弹幕
p20 20、分布式组件-SpringCloud Alibaba简介
笔记
疑问
bug
弹幕
p21 21、分布式组件-SpringCloud Alibaba-Nacos注册中心
笔记
疑问
bug
nacos启动失败
cmd中改为standalone
弹幕
p22 22、分布式组件-SpringCloud-OpenFeign测试远程调用
笔记
远程
疑问
bug
Did you forget to include spring-cloud-starter-loadbalancer
解决方法参考文献
上面那份解决方法不够完美,可以在common统一管理
加了dependencymanagement可以不用加版本号
properties里写变量
代码详情
1 | "D:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=7591:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-member\target\classes;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.5.4\spring-boot-starter-web-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter\2.5.4\spring-boot-starter-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot\2.5.4\spring-boot-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.4\spring-boot-autoconfigure-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.5.4\spring-boot-starter-logging-2.5.4.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-classic\1.2.5\logback-classic-1.2.5.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-core\1.2.5\logback-core-1.2.5.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;D:\Users\LND\.m2\repository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;D:\Users\LND\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Users\LND\.m2\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.5.4\spring-boot-starter-json-2.5.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.4\jackson-databind-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.4\jackson-annotations-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.4\jackson-core-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.4\jackson-datatype-jdk8-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.4\jackson-datatype-jsr310-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.4\jackson-module-parameter-names-2.12.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.4\spring-boot-starter-tomcat-2.5.4.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.52\tomcat-embed-core-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.52\tomcat-embed-el-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.52\tomcat-embed-websocket-9.0.52.jar;D:\Users\LND\.m2\repository\org\springframework\spring-web\5.3.9\spring-web-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-beans\5.3.9\spring-beans-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-webmvc\5.3.9\spring-webmvc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-aop\5.3.9\spring-aop-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-context\5.3.9\spring-context-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-expression\5.3.9\spring-expression-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-openfeign\3.0.3\spring-cloud-starter-openfeign-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter\3.0.3\spring-cloud-starter-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-context\3.0.3\spring-cloud-context-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.0.3\spring-cloud-openfeign-core-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.5.4\spring-boot-starter-aop-2.5.4.jar;D:\Users\LND\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;D:\Users\LND\.m2\repository\commons-fileupload\commons-fileupload\1.4\commons-fileupload-1.4.jar;D:\Users\LND\.m2\repository\commons-io\commons-io\2.2\commons-io-2.2.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-commons\3.0.3\spring-cloud-commons-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-crypto\5.5.2\spring-security-crypto-5.5.2.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-core\10.12\feign-core-10.12.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-slf4j\10.12\feign-slf4j-10.12.jar;D:\Users\LND\.m2\repository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;D:\Users\LND\.m2\repository\org\springframework\spring-core\5.3.9\spring-core-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jcl\5.3.9\spring-jcl-5.3.9.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-common\target\classes;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.2.0\mybatis-plus-boot-starter-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus\3.2.0\mybatis-plus-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-extension\3.2.0\mybatis-plus-extension-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-core\3.2.0\mybatis-plus-core-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-annotation\3.2.0\mybatis-plus-annotation-3.2.0.jar;D:\Users\LND\.m2\repository\com\github\jsqlparser\jsqlparser\2.1\jsqlparser-2.1.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis-spring\2.0.2\mybatis-spring-2.0.2.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.5.4\spring-boot-starter-jdbc-2.5.4.jar;D:\Users\LND\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jdbc\5.3.9\spring-jdbc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-tx\5.3.9\spring-tx-5.3.9.jar;D:\Users\LND\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore\4.4.14\httpcore-4.4.14.jar;D:\Users\LND\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\Users\LND\.m2\repository\mysql\mysql-connector-java\8.0.26\mysql-connector-java-8.0.26.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2.2.5.RELEASE\spring-cloud-starter-alibaba-nacos-discovery-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2.2.5.RELEASE\spring-cloud-alibaba-commons-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-client\1.4.1\nacos-client-1.4.1.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-common\1.4.1\nacos-common-1.4.1.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.14\httpcore-nio-4.4.14.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-api\1.4.1\nacos-api-1.4.1.jar;D:\Users\LND\.m2\repository\com\google\guava\guava\24.1.1-jre\guava-24.1.1-jre.jar;D:\Users\LND\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;D:\Users\LND\.m2\repository\org\checkerframework\checker-compat-qual\2.0.0\checker-compat-qual-2.0.0.jar;D:\Users\LND\.m2\repository\com\google\errorprone\error_prone_annotations\2.1.3\error_prone_annotations-2.1.3.jar;D:\Users\LND\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;D:\Users\LND\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;D:\Users\LND\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\Users\LND\.m2\repository\io\prometheus\simpleclient\0.10.0\simpleclient-0.10.0.jar;D:\Users\LND\.m2\repository\com\alibaba\spring\spring-context-support\1.0.10\spring-context-support-1.0.10.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-netflix-ribbon\2.2.5.RELEASE\spring-cloud-starter-netflix-ribbon-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-netflix-ribbon\2.2.5.RELEASE\spring-cloud-netflix-ribbon-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-netflix-archaius\2.2.5.RELEASE\spring-cloud-netflix-archaius-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-netflix-archaius\2.2.5.RELEASE\spring-cloud-starter-netflix-archaius-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\netflix\archaius\archaius-core\0.7.6\archaius-core-0.7.6.jar;D:\Users\LND\.m2\repository\commons-configuration\commons-configuration\1.8\commons-configuration-1.8.jar;D:\Users\LND\.m2\repository\com\netflix\ribbon\ribbon\2.3.0\ribbon-2.3.0.jar;D:\Users\LND\.m2\repository\com\netflix\ribbon\ribbon-transport\2.3.0\ribbon-transport-2.3.0.jar;D:\Users\LND\.m2\repository\io\reactivex\rxnetty-contexts\0.4.9\rxnetty-contexts-0.4.9.jar;D:\Users\LND\.m2\repository\io\reactivex\rxnetty-servo\0.4.9\rxnetty-servo-0.4.9.jar;D:\Users\LND\.m2\repository\com\netflix\hystrix\hystrix-core\1.4.3\hystrix-core-1.4.3.jar;D:\Users\LND\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;D:\Users\LND\.m2\repository\io\reactivex\rxnetty\0.4.9\rxnetty-0.4.9.jar;D:\Users\LND\.m2\repository\com\netflix\ribbon\ribbon-core\2.3.0\ribbon-core-2.3.0.jar;D:\Users\LND\.m2\repository\com\netflix\ribbon\ribbon-httpclient\2.3.0\ribbon-httpclient-2.3.0.jar;D:\Users\LND\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;D:\Users\LND\.m2\repository\com\sun\jersey\jersey-client\1.19.1\jersey-client-1.19.1.jar;D:\Users\LND\.m2\repository\com\sun\jersey\jersey-core\1.19.1\jersey-core-1.19.1.jar;D:\Users\LND\.m2\repository\javax\ws\rs\jsr311-api\1.1.1\jsr311-api-1.1.1.jar;D:\Users\LND\.m2\repository\com\sun\jersey\contribs\jersey-apache-client4\1.19.1\jersey-apache-client4-1.19.1.jar;D:\Users\LND\.m2\repository\com\netflix\servo\servo-core\0.10.1\servo-core-0.10.1.jar;D:\Users\LND\.m2\repository\com\netflix\servo\servo-internal\0.10.1\servo-internal-0.10.1.jar;D:\Users\LND\.m2\repository\com\netflix\netflix-commons\netflix-commons-util\0.1.1\netflix-commons-util-0.1.1.jar;D:\Users\LND\.m2\repository\com\netflix\ribbon\ribbon-loadbalancer\2.3.0\ribbon-loadbalancer-2.3.0.jar;D:\Users\LND\.m2\repository\com\netflix\netflix-commons\netflix-statistics\0.1.1\netflix-statistics-0.1.1.jar;D:\Users\LND\.m2\repository\io\reactivex\rxjava\1.3.8\rxjava-1.3.8.jar" com.atguigu.gulimall.member.GulimallMemberApplication |
弹幕
p23 23、分布式组件-SpringCloud Alibaba-Nacos配置中心-简单示例
笔记
- 改了bootstrap.yml记得重启应用
疑问
bug
没有从nacos中读取配置
弹幕
p24 24、分布式组件-SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组
笔记
- 命名空间
- 是为了解决配置隔离的问题
- 隔离开发测试环境
- 微服务之间配置隔离
- 配置集:所有的配置的集合
- 配置集ID:(DATA ID)类似文件名
- 配置分组
- 默认所有的配置分组都是default
- 双十一的时候使用一组,618等等
每个微服务创建自己的命名分组,使用配置分组区分环境,dev,test,pord
图片详情

隔离开发测试环境
图片详情

可以直接指定名字+文件类型
疑问
bug
弹幕
p25 25、分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集
笔记
疑问
bug
弹幕
p26 26、分布式组件-SpringCloud-Gateway网关核心概念&原理
笔记
疑问
nginx vs spring cloud Gateway的区别
参考文献: API网关比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)
spring cloud相比spring boot+nginx有什么优势?
bug
弹幕
p27 27、分布式组件-SpringCloud-Gateway-创建&测试API网关
笔记
疑问
bug
弹幕
p28 28、前端基础-技术栈简介
笔记
疑问
bug
弹幕
p29 29、前端基础-ES6-let&const
笔记
疑问
bug
弹幕
p30 30、前端基础-ES6-解构&字符串
笔记
疑问
bug
弹幕
p31 31、前端基础-ES6-箭头函数
笔记
疑问
bug
弹幕
p32 32、前端基础-ES6-对象优化
笔记
疑问
bug
弹幕
p33 33、前端基础-ES6-map、reduce
笔记
疑问
bug
弹幕
p34 34、前端基础-ES6-promise异步编排
笔记
疑问
bug
Access to XMLHttpRequest at ‘file:///D:/Users/LND/Desktop/ereaseo/gulimall/ES6/mock/user.json’ from origin ‘null’
代码详情
1 | ccess to XMLHttpRequest at 'file:///D:/Users/LND/Desktop/ereaseo/gulimall/ES6/mock/user.json' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https. |
jquery拿到的是字符串
图片详情

弹幕
p35 35、前端基础-ES6-模块化
笔记
初始化环境npm init -y
疑问
bug
弹幕
p36 36、前端基础-Vue-介绍&HelloWorld
笔记
疑问
bug
弹幕
p37 37、前端基础-Vue-基本语法&插件安装
笔记
疑问
bug
弹幕
p38 38、前端基础-Vue-指令-单向绑定&双向绑定
笔记
疑问
bug
弹幕
p39 39、前端基础-Vue-指令-v-on、v-for、v-if
笔记
疑问
bug
弹幕
p40 40、前端基础-Vue-计算属性和侦听器
笔记
疑问
bug
弹幕
p41 41、前端基础-Vue-组件化基础
笔记
疑问
bug
弹幕
p42 42、前端基础-Vue-生命周期和钩子函数
笔记
疑问
bug
弹幕
p43 43、前端基础-Vue-使用Vue脚手架进行模块化开发
笔记
安装插件
npm install webpack -g
npm install -g @vue/cli-init
新建一个vue项目
vue init webpack appname
杂
@相当于src的根目录
疑问
bug
一开始没有装上?
代码详情
1 | Microsoft Windows [版本 10.0.19043.1237] |
将oss的版本设置为2.1.0.release
代码详情
1 | <dependency> |
弹幕
p44 44、前端基础-Vue-整合ElementUI快速开发
笔记
疑问
bug
弹幕
p45 45、商品服务-API-三级分类-查询-递归树形结构数据获取
笔记
疑问
bug
弹幕
p46 46、商品服务-API-三级分类-配置网关路由与路径重写
笔记
疑问
bug
java.lang.IllegalArgumentException: Could not find class [org.springframework.cloud.client.loadbalancer.LoadBalancerProperties]
代码详情
1 | "D:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=2614:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\Users\LND\Desktop\ereaseo\gulimall\renren-fast\target\classes;D:\Users\LND\.m2\repository\com\google\code\gson\gson\2.8.5\gson-2.8.5.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-common\target\classes;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2.2.5.RELEASE\spring-cloud-starter-alibaba-nacos-discovery-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2.2.5.RELEASE\spring-cloud-alibaba-commons-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-client\1.4.1\nacos-client-1.4.1.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-common\1.4.1\nacos-common-1.4.1.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.13\httpcore-nio-4.4.13.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-api\1.4.1\nacos-api-1.4.1.jar;D:\Users\LND\.m2\repository\io\prometheus\simpleclient\0.5.0\simpleclient-0.5.0.jar;D:\Users\LND\.m2\repository\com\alibaba\spring\spring-context-support\1.0.10\spring-context-support-1.0.10.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-commons\2.2.5.RELEASE\spring-cloud-commons-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-crypto\5.2.1.RELEASE\spring-security-crypto-5.2.1.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-context\2.2.5.RELEASE\spring-cloud-context-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-loadbalancer\3.0.3\spring-cloud-loadbalancer-3.0.3.jar;D:\Users\LND\.m2\repository\io\projectreactor\reactor-core\3.3.2.RELEASE\reactor-core-3.3.2.RELEASE.jar;D:\Users\LND\.m2\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;D:\Users\LND\.m2\repository\io\projectreactor\addons\reactor-extra\3.3.2.RELEASE\reactor-extra-3.3.2.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2.2.5.RELEASE\spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-bootstrap\3.0.3\spring-cloud-starter-bootstrap-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter\3.0.3\spring-cloud-starter-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter\2.2.4.RELEASE\spring-boot-starter-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot\2.2.4.RELEASE\spring-boot-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.2.4.RELEASE\spring-boot-starter-logging-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.12.1\log4j-to-slf4j-2.12.1.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-api\2.12.1\log4j-api-2.12.1.jar;D:\Users\LND\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\Users\LND\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Users\LND\.m2\repository\org\yaml\snakeyaml\1.25\snakeyaml-1.25.jar;D:\Users\LND\.m2\repository\org\hamcrest\hamcrest\2.1\hamcrest-2.1.jar;D:\Users\LND\.m2\repository\net\bytebuddy\byte-buddy\1.10.6\byte-buddy-1.10.6.jar;D:\Users\LND\.m2\repository\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.2.4.RELEASE\spring-boot-starter-web-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.2.4.RELEASE\spring-boot-starter-json-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.10.2\jackson-datatype-jdk8-2.10.2.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.10.2\jackson-datatype-jsr310-2.10.2.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.10.2\jackson-module-parameter-names-2.10.2.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.2.4.RELEASE\spring-boot-starter-tomcat-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.30\tomcat-embed-core-9.0.30.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.30\tomcat-embed-el-9.0.30.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.30\tomcat-embed-websocket-9.0.30.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.2.4.RELEASE\spring-boot-starter-validation-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\Users\LND\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.18.Final\hibernate-validator-6.0.18.Final.jar;D:\Users\LND\.m2\repository\org\jboss\logging\jboss-logging\3.4.1.Final\jboss-logging-3.4.1.Final.jar;D:\Users\LND\.m2\repository\org\springframework\spring-web\5.2.3.RELEASE\spring-web-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-webmvc\5.2.3.RELEASE\spring-webmvc-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.2.4.RELEASE\spring-boot-starter-aop-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\aspectj\aspectjweaver\1.9.5\aspectjweaver-1.9.5.jar;D:\Users\LND\.m2\repository\org\springframework\spring-context-support\5.2.3.RELEASE\spring-context-support-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\2.2.4.RELEASE\spring-boot-starter-data-redis-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\data\spring-data-redis\2.2.4.RELEASE\spring-data-redis-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\data\spring-data-keyvalue\2.2.4.RELEASE\spring-data-keyvalue-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\data\spring-data-commons\2.2.4.RELEASE\spring-data-commons-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-tx\5.2.3.RELEASE\spring-tx-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\spring-oxm\5.2.3.RELEASE\spring-oxm-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\io\lettuce\lettuce-core\5.2.1.RELEASE\lettuce-core-5.2.1.RELEASE.jar;D:\Users\LND\.m2\repository\io\netty\netty-common\4.1.45.Final\netty-common-4.1.45.Final.jar;D:\Users\LND\.m2\repository\io\netty\netty-handler\4.1.45.Final\netty-handler-4.1.45.Final.jar;D:\Users\LND\.m2\repository\io\netty\netty-buffer\4.1.45.Final\netty-buffer-4.1.45.Final.jar;D:\Users\LND\.m2\repository\io\netty\netty-codec\4.1.45.Final\netty-codec-4.1.45.Final.jar;D:\Users\LND\.m2\repository\io\netty\netty-transport\4.1.45.Final\netty-transport-4.1.45.Final.jar;D:\Users\LND\.m2\repository\io\netty\netty-resolver\4.1.45.Final\netty-resolver-4.1.45.Final.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-configuration-processor\2.2.4.RELEASE\spring-boot-configuration-processor-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.3.1\mybatis-plus-boot-starter-3.3.1.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus\3.3.1\mybatis-plus-3.3.1.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-extension\3.3.1\mybatis-plus-extension-3.3.1.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-core\3.3.1\mybatis-plus-core-3.3.1.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-annotation\3.3.1\mybatis-plus-annotation-3.3.1.jar;D:\Users\LND\.m2\repository\com\github\jsqlparser\jsqlparser\3.1\jsqlparser-3.1.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis-spring\2.0.3\mybatis-spring-2.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.2.4.RELEASE\spring-boot-autoconfigure-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.2.4.RELEASE\spring-boot-starter-jdbc-2.2.4.RELEASE.jar;D:\Users\LND\.m2\repository\com\zaxxer\HikariCP\3.4.2\HikariCP-3.4.2.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jdbc\5.2.3.RELEASE\spring-jdbc-5.2.3.RELEASE.jar;D:\Users\LND\.m2\repository\mysql\mysql-connector-java\8.0.17\mysql-connector-java-8.0.17.jar;D:\Users\LND\.m2\repository\com\oracle\ojdbc6\11.2.0.3\ojdbc6-11.2.0.3.jar;D:\Users\LND\.m2\repository\com\microsoft\sqlserver\sqljdbc4\4.0\sqljdbc4-4.0.jar;D:\Users\LND\.m2\repository\org\postgresql\postgresql\42.2.9\postgresql-42.2.9.jar;D:\Users\LND\.m2\repository\com\alibaba\druid-spring-boot-starter\1.1.13\druid-spring-boot-starter-1.1.13.jar;D:\Users\LND\.m2\repository\com\alibaba\druid\1.1.13\druid-1.1.13.jar;D:\Users\LND\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\Users\LND\.m2\repository\org\quartz-scheduler\quartz\2.3.0\quartz-2.3.0.jar;D:\Users\LND\.m2\repository\com\mchange\mchange-commons-java\0.2.11\mchange-commons-java-0.2.11.jar;D:\Users\LND\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\Users\LND\.m2\repository\commons-fileupload\commons-fileupload\1.2.2\commons-fileupload-1.2.2.jar;D:\Users\LND\.m2\repository\commons-io\commons-io\2.5\commons-io-2.5.jar;D:\Users\LND\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;D:\Users\LND\.m2\repository\commons-configuration\commons-configuration\1.10\commons-configuration-1.10.jar;D:\Users\LND\.m2\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-core\1.4.0\shiro-core-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-lang\1.4.0\shiro-lang-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-cache\1.4.0\shiro-cache-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-crypto-hash\1.4.0\shiro-crypto-hash-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-crypto-core\1.4.0\shiro-crypto-core-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-crypto-cipher\1.4.0\shiro-crypto-cipher-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-config-core\1.4.0\shiro-config-core-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-config-ogdl\1.4.0\shiro-config-ogdl-1.4.0.jar;D:\Users\LND\.m2\repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;D:\Users\LND\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-event\1.4.0\shiro-event-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-spring\1.4.0\shiro-spring-1.4.0.jar;D:\Users\LND\.m2\repository\org\apache\shiro\shiro-web\1.4.0\shiro-web-1.4.0.jar;D:\Users\LND\.m2\repository\io\jsonwebtoken\jjwt\0.7.0\jjwt-0.7.0.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.10.2\jackson-databind-2.10.2.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.10.2\jackson-annotations-2.10.2.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.10.2\jackson-core-2.10.2.jar;D:\Users\LND\.m2\repository\com\github\axet\kaptcha\0.0.9\kaptcha-0.0.9.jar;D:\Users\LND\.m2\repository\com\jhlabs\filters\2.0.235\filters-2.0.235.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-swagger2\2.7.0\springfox-swagger2-2.7.0.jar;D:\Users\LND\.m2\repository\io\swagger\swagger-annotations\1.5.13\swagger-annotations-1.5.13.jar;D:\Users\LND\.m2\repository\io\swagger\swagger-models\1.5.13\swagger-models-1.5.13.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-spi\2.7.0\springfox-spi-2.7.0.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-core\2.7.0\springfox-core-2.7.0.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-schema\2.7.0\springfox-schema-2.7.0.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-swagger-common\2.7.0\springfox-swagger-common-2.7.0.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-spring-web\2.7.0\springfox-spring-web-2.7.0.jar;D:\Users\LND\.m2\repository\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;D:\Users\LND\.m2\repository\org\javassist\javassist\3.21.0-GA\javassist-3.21.0-GA.jar;D:\Users\LND\.m2\repository\com\google\guava\guava\18.0\guava-18.0.jar;D:\Users\LND\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\Users\LND\.m2\repository\org\springframework\plugin\spring-plugin-core\1.2.0.RELEASE\spring-plugin-core-1.2.0.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\plugin\spring-plugin-metadata\1.2.0.RELEASE\spring-plugin-metadata-1.2.0.RELEASE.jar;D:\Users\LND\.m2\repository\org\mapstruct\mapstruct\1.1.0.Final\mapstruct-1.1.0.Final.jar;D:\Users\LND\.m2\repository\io\springfox\springfox-swagger-ui\2.7.0\springfox-swagger-ui-2.7.0.jar;D:\Users\LND\.m2\repository\com\qiniu\qiniu-java-sdk\7.2.23\qiniu-java-sdk-7.2.23.jar;D:\Users\LND\.m2\repository\com\squareup\okhttp3\okhttp\3.14.6\okhttp-3.14.6.jar;D:\Users\LND\.m2\repository\com\squareup\okio\okio\1.17.2\okio-1.17.2.jar;D:\Users\LND\.m2\repository\com\aliyun\oss\aliyun-sdk-oss\2.8.3\aliyun-sdk-oss-2.8.3.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpclient\4.5.10\httpclient-4.5.10.jar;D:\Users\LND\.m2\repository\org\jdom\jdom\1.1\jdom-1.1.jar;D:\Users\LND\.m2\repository\com\qcloud\cos_api\4.4\cos_api-4.4.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpmime\4.5.10\httpmime-4.5.10.jar;D:\Users\LND\.m2\repository\org\json\json\20140107\json-20140107.jar;D:\Users\LND\.m2\repository\junit\junit\4.12\junit-4.12.jar;D:\Users\LND\.m2\repository\org\hamcrest\hamcrest-core\2.1\hamcrest-core-2.1.jar;D:\Users\LND\.m2\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;D:\Users\LND\.m2\repository\com\alibaba\fastjson\1.2.72\fastjson-1.2.72.jar;D:\Users\LND\.m2\repository\cn\hutool\hutool-all\4.1.1\hutool-all-4.1.1.jar;D:\Users\LND\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar" io.renren.RenrenApplication |
参考文献2
弹幕
p47 47、商品服务-API-三级分类-网关统一配置跨域
笔记
IDEA快速查看接口的实现
疑问
bug
debug发现没有进入断点
包路径错误
没有注入到容器中
图片详情

springboot后续版本跨域解决方法
弹幕
p48 48、商品服务-API-三级分类-查询-树形展示三级分类数据
笔记
疑问
bug
弹幕
p49 49、商品服务-API-三级分类-删除-页面效果
笔记
@requestbody
获取请求体,必须发送POST请求
疑问
bug
弹幕
p50 50、商品服务-API-三级分类-删除-逻辑删除
笔记
逻辑删除
1)、配置全局的逻辑删除规则(省略)
2)、配置逻辑删除的组件Bean(省略)
3)、加上逻辑删除注解
疑问
bug
弹幕
p51 51、商品服务-API-三级分类-删除-删除效果细化
笔记
撤销删除操作
UPDATEpms_categorySET show_status=1
疑问
bug
弹幕
p52 52、商品服务-API-三级分类-新增-新增效果完成
笔记
疑问
bug
弹幕
p53 53、商品服务-API-三级分类-修改-基本修改效果完成
笔记
疑问
bug
弹幕
p54 54、商品服务-API-三级分类-修改-拖拽效果
笔记
疑问
bug
弹幕
p55 55、商品服务-API-三级分类-修改-拖拽数据收集
笔记
疑问
bug
弹幕
p56 56、商品服务-API-三级分类-修改-拖拽功能完成
笔记
疑问
bug
弹幕
p57 57、商品服务-API-三级分类-修改-批量拖拽效果
笔记
疑问
bug
弹幕
p58 58、商品服务-API-三级分类-删除-批量删除&小结
笔记
疑问
bug
弹幕
p59 59、商品服务-API-品牌管理-使用逆向工程的前后端代码
笔记
疑问
bug
弹幕
p60 60、商品服务-API-品牌管理-效果优化与快速显示开关
笔记
疑问
bug
弹幕
p61 61、商品服务-API-品牌管理-云存储开通与使用
笔记
疑问
bug
弹幕
p62 62、商品服务-API-品牌管理-OSS整合测试
笔记
疑问
bug
cannot resolve
添加dependency
代码详情
1 | <dependency> |
创建bean失败
代码详情
1 | "D:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar=3291:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\lib\idea_rt.jar;C:\Users\lnd\.m2\repository\org\junit\platform\junit-platform-launcher\1.7.2\junit-platform-launcher-1.7.2.jar;C:\Users\lnd\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;C:\Users\lnd\.m2\repository\org\junit\platform\junit-platform-engine\1.7.2\junit-platform-engine-1.7.2.jar;C:\Users\lnd\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\lnd\.m2\repository\org\junit\platform\junit-platform-commons\1.7.2\junit-platform-commons-1.7.2.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.2\plugins\junit\lib\junit-rt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-product\target\test-classes;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-product\target\classes;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.5.4\spring-boot-starter-web-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter\2.5.4\spring-boot-starter-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot\2.5.4\spring-boot-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.4\spring-boot-autoconfigure-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.5.4\spring-boot-starter-logging-2.5.4.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-classic\1.2.5\logback-classic-1.2.5.jar;D:\Users\LND\.m2\repository\ch\qos\logback\logback-core\1.2.5\logback-core-1.2.5.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;D:\Users\LND\.m2\repository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;D:\Users\LND\.m2\repository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;D:\Users\LND\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Users\LND\.m2\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.5.4\spring-boot-starter-json-2.5.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.4\jackson-databind-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.4\jackson-annotations-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.4\jackson-core-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.4\jackson-datatype-jdk8-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.4\jackson-datatype-jsr310-2.12.4.jar;D:\Users\LND\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.4\jackson-module-parameter-names-2.12.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.4\spring-boot-starter-tomcat-2.5.4.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.52\tomcat-embed-core-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.52\tomcat-embed-el-9.0.52.jar;D:\Users\LND\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.52\tomcat-embed-websocket-9.0.52.jar;D:\Users\LND\.m2\repository\org\springframework\spring-web\5.3.9\spring-web-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-beans\5.3.9\spring-beans-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-webmvc\5.3.9\spring-webmvc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-aop\5.3.9\spring-aop-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-context\5.3.9\spring-context-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-expression\5.3.9\spring-expression-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-openfeign\3.0.3\spring-cloud-starter-openfeign-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter\3.0.3\spring-cloud-starter-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-context\3.0.3\spring-cloud-context-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.0.3\spring-cloud-openfeign-core-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-aop\2.5.4\spring-boot-starter-aop-2.5.4.jar;D:\Users\LND\.m2\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;D:\Users\LND\.m2\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;D:\Users\LND\.m2\repository\commons-fileupload\commons-fileupload\1.4\commons-fileupload-1.4.jar;D:\Users\LND\.m2\repository\commons-io\commons-io\2.2\commons-io-2.2.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-commons\3.0.3\spring-cloud-commons-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\security\spring-security-crypto\5.5.2\spring-security-crypto-5.5.2.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-core\10.12\feign-core-10.12.jar;D:\Users\LND\.m2\repository\io\github\openfeign\feign-slf4j\10.12\feign-slf4j-10.12.jar;D:\Users\LND\.m2\repository\org\slf4j\slf4j-api\1.7.32\slf4j-api-1.7.32.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-test\2.5.4\spring-boot-starter-test-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-test\2.5.4\spring-boot-test-2.5.4.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\2.5.4\spring-boot-test-autoconfigure-2.5.4.jar;D:\Users\LND\.m2\repository\com\jayway\jsonpath\json-path\2.5.0\json-path-2.5.0.jar;D:\Users\LND\.m2\repository\net\minidev\json-smart\2.4.7\json-smart-2.4.7.jar;D:\Users\LND\.m2\repository\net\minidev\accessors-smart\2.4.7\accessors-smart-2.4.7.jar;D:\Users\LND\.m2\repository\org\ow2\asm\asm\9.1\asm-9.1.jar;D:\Users\LND\.m2\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\Users\LND\.m2\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;D:\Users\LND\.m2\repository\org\assertj\assertj-core\3.19.0\assertj-core-3.19.0.jar;D:\Users\LND\.m2\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;D:\Users\LND\.m2\repository\org\junit\jupiter\junit-jupiter\5.7.2\junit-jupiter-5.7.2.jar;D:\Users\LND\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.7.2\junit-jupiter-api-5.7.2.jar;D:\Users\LND\.m2\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;D:\Users\LND\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;D:\Users\LND\.m2\repository\org\junit\platform\junit-platform-commons\1.7.2\junit-platform-commons-1.7.2.jar;D:\Users\LND\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.7.2\junit-jupiter-params-5.7.2.jar;D:\Users\LND\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.7.2\junit-jupiter-engine-5.7.2.jar;D:\Users\LND\.m2\repository\org\junit\platform\junit-platform-engine\1.7.2\junit-platform-engine-1.7.2.jar;D:\Users\LND\.m2\repository\org\mockito\mockito-core\3.9.0\mockito-core-3.9.0.jar;D:\Users\LND\.m2\repository\net\bytebuddy\byte-buddy\1.10.22\byte-buddy-1.10.22.jar;D:\Users\LND\.m2\repository\net\bytebuddy\byte-buddy-agent\1.10.22\byte-buddy-agent-1.10.22.jar;D:\Users\LND\.m2\repository\org\objenesis\objenesis\3.2\objenesis-3.2.jar;D:\Users\LND\.m2\repository\org\mockito\mockito-junit-jupiter\3.9.0\mockito-junit-jupiter-3.9.0.jar;D:\Users\LND\.m2\repository\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;D:\Users\LND\.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\Users\LND\.m2\repository\org\springframework\spring-core\5.3.9\spring-core-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jcl\5.3.9\spring-jcl-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-test\5.3.9\spring-test-5.3.9.jar;D:\Users\LND\.m2\repository\org\xmlunit\xmlunit-core\2.8.2\xmlunit-core-2.8.2.jar;D:\Users\LND\Desktop\ereaseo\gulimall\gulimall-common\target\classes;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-boot-starter\3.2.0\mybatis-plus-boot-starter-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus\3.2.0\mybatis-plus-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-extension\3.2.0\mybatis-plus-extension-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-core\3.2.0\mybatis-plus-core-3.2.0.jar;D:\Users\LND\.m2\repository\com\baomidou\mybatis-plus-annotation\3.2.0\mybatis-plus-annotation-3.2.0.jar;D:\Users\LND\.m2\repository\com\github\jsqlparser\jsqlparser\2.1\jsqlparser-2.1.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\Users\LND\.m2\repository\org\mybatis\mybatis-spring\2.0.2\mybatis-spring-2.0.2.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.5.4\spring-boot-starter-jdbc-2.5.4.jar;D:\Users\LND\.m2\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\spring-jdbc\5.3.9\spring-jdbc-5.3.9.jar;D:\Users\LND\.m2\repository\org\springframework\spring-tx\5.3.9\spring-tx-5.3.9.jar;D:\Users\LND\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore\4.4.14\httpcore-4.4.14.jar;D:\Users\LND\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\Users\LND\.m2\repository\mysql\mysql-connector-java\8.0.26\mysql-connector-java-8.0.26.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2.2.5.RELEASE\spring-cloud-starter-alibaba-nacos-discovery-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2.2.5.RELEASE\spring-cloud-alibaba-commons-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-client\1.4.1\nacos-client-1.4.1.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-common\1.4.1\nacos-common-1.4.1.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpcore-nio\4.4.14\httpcore-nio-4.4.14.jar;D:\Users\LND\.m2\repository\com\alibaba\nacos\nacos-api\1.4.1\nacos-api-1.4.1.jar;D:\Users\LND\.m2\repository\com\google\guava\guava\24.1.1-jre\guava-24.1.1-jre.jar;D:\Users\LND\.m2\repository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;D:\Users\LND\.m2\repository\org\checkerframework\checker-compat-qual\2.0.0\checker-compat-qual-2.0.0.jar;D:\Users\LND\.m2\repository\com\google\errorprone\error_prone_annotations\2.1.3\error_prone_annotations-2.1.3.jar;D:\Users\LND\.m2\repository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;D:\Users\LND\.m2\repository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;D:\Users\LND\.m2\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;D:\Users\LND\.m2\repository\io\prometheus\simpleclient\0.10.0\simpleclient-0.10.0.jar;D:\Users\LND\.m2\repository\com\alibaba\spring\spring-context-support\1.0.10\spring-context-support-1.0.10.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-loadbalancer\3.0.3\spring-cloud-loadbalancer-3.0.3.jar;D:\Users\LND\.m2\repository\org\springframework\boot\spring-boot-starter-validation\2.5.4\spring-boot-starter-validation-2.5.4.jar;D:\Users\LND\.m2\repository\org\hibernate\validator\hibernate-validator\6.2.0.Final\hibernate-validator-6.2.0.Final.jar;D:\Users\LND\.m2\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\Users\LND\.m2\repository\org\jboss\logging\jboss-logging\3.4.2.Final\jboss-logging-3.4.2.Final.jar;D:\Users\LND\.m2\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\Users\LND\.m2\repository\io\projectreactor\reactor-core\3.4.9\reactor-core-3.4.9.jar;D:\Users\LND\.m2\repository\org\reactivestreams\reactive-streams\1.0.3\reactive-streams-1.0.3.jar;D:\Users\LND\.m2\repository\io\projectreactor\addons\reactor-extra\3.4.4\reactor-extra-3.4.4.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2.2.5.RELEASE\spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar;D:\Users\LND\.m2\repository\org\springframework\cloud\spring-cloud-starter-bootstrap\3.0.3\spring-cloud-starter-bootstrap-3.0.3.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\aliyun-oss-spring-boot-starter\1.0.0\aliyun-oss-spring-boot-starter-1.0.0.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\aliyun-context-spring-boot-starter\1.0.0\aliyun-context-spring-boot-starter-1.0.0.jar;D:\Users\LND\.m2\repository\com\alibaba\cloud\alicloud-context\1.0.5\alicloud-context-1.0.5.jar;D:\Users\LND\.m2\repository\com\aliyun\aliyun-java-sdk-edas\2.44.0\aliyun-java-sdk-edas-2.44.0.jar;D:\Users\LND\.m2\repository\com\google\code\gson\gson\2.8.7\gson-2.8.7.jar;D:\Users\LND\.m2\repository\com\aliyun\oss\aliyun-sdk-oss\3.1.0\aliyun-sdk-oss-3.1.0.jar;D:\Users\LND\.m2\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;D:\Users\LND\.m2\repository\org\jdom\jdom\1.1\jdom-1.1.jar;D:\Users\LND\.m2\repository\com\sun\jersey\jersey-json\1.9\jersey-json-1.9.jar;D:\Users\LND\.m2\repository\org\codehaus\jettison\jettison\1.1\jettison-1.1.jar;D:\Users\LND\.m2\repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;D:\Users\LND\.m2\repository\com\sun\xml\bind\jaxb-impl\2.2.3-1\jaxb-impl-2.2.3-1.jar;D:\Users\LND\.m2\repository\javax\xml\bind\jaxb-api\2.3.1\jaxb-api-2.3.1.jar;D:\Users\LND\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;D:\Users\LND\.m2\repository\org\codehaus\jackson\jackson-core-asl\1.8.3\jackson-core-asl-1.8.3.jar;D:\Users\LND\.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.8.3\jackson-mapper-asl-1.8.3.jar;D:\Users\LND\.m2\repository\org\codehaus\jackson\jackson-jaxrs\1.8.3\jackson-jaxrs-1.8.3.jar;D:\Users\LND\.m2\repository\org\codehaus\jackson\jackson-xc\1.8.3\jackson-xc-1.8.3.jar;D:\Users\LND\.m2\repository\com\sun\jersey\jersey-core\1.9\jersey-core-1.9.jar;D:\Users\LND\.m2\repository\com\aliyun\aliyun-java-sdk-core\3.4.0\aliyun-java-sdk-core-3.4.0.jar;D:\Users\LND\.m2\repository\org\json\json\20170516\json-20170516.jar;D:\Users\LND\.m2\repository\com\aliyun\aliyun-java-sdk-ram\3.0.0\aliyun-java-sdk-ram-3.0.0.jar;D:\Users\LND\.m2\repository\com\aliyun\aliyun-java-sdk-sts\3.0.0\aliyun-java-sdk-sts-3.0.0.jar;D:\Users\LND\.m2\repository\com\aliyun\aliyun-java-sdk-ecs\4.2.0\aliyun-java-sdk-ecs-4.2.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.atguigu.gulimall.product.GulimallProductApplicationTests,testUpload |
弹幕
p63 63、商品服务-API-品牌管理-OSS获取服务端签名
笔记
疑问
bug
弹幕
p64 64、商品服务-API-品牌管理-OSS前后联调测试上传
笔记
疑问
bug
弹幕
p65 65、商品服务-API-品牌管理-表单校验&自定义校验器
笔记
vue的scope
疑问
bug
弹幕
p66 66、商品服务-API-品牌管理-JSR303数据校验
笔记
疑问
bug
弹幕
p67 67、商品服务-API-品牌管理-统一异常处理
笔记
疑问
bug
弹幕
p68 68、商品服务-API-品牌管理-JSR303分组校验
笔记
疑问
bug
弹幕
p69 69、商品服务-API-品牌管理-JSR303自定义校验注解
笔记
疑问
bug
弹幕
p70 70、商品服务-概念-SPU&SKU&规格参数&销售属性
笔记
SPU
SPU:Standard Product Unit(标准化产品单元) 是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一 个产品的特性。
SKU
SKU:Stock Keeping Unit(库存量单位) 即库存进出计量的基本单元,可以是以件,盒,托盘等为单位。SKU 这是对于大型连锁超市 DC(配送中心)物流管理的一个必要的方法。现在已经被引申为产品统一编号的简称,每 种产品均对应有唯一的 SKU 号。
SPU和SKU的区别与联系
决定SKU的叫做销售属性
基本属性【规格参数】与销售属性
每个分类下的商品共享规格参数,与销售属性。只是有些商品不一定要用这个分类下全部的属性;
- 属性是以三级分类组织起来的
- 规格参数中有些是可以提供检索的
- 规格参数也是基本属性,他们具有自己的分组
- 属性的分组也是以三级分类组织起来的
- 属性名确定的,但是值是每一个商品不同来决定的
疑问
bug
弹幕
p71 71、商品服务-API-属性分组-前端组件抽取&父子组件交互
笔记
子组件给父组件传递数据,事件机制
疑问
bug
弹幕
p72 72、商品服务-API-属性分组-获取分类属性分组
笔记
疑问
bug
弹幕
p73 73、商品服务-API-属性分组-分组新增&级联选择器
笔记
疑问
bug
弹幕
p74 74、商品服务-API-属性分组-分组修改&级联选择器回显
笔记
疑问
bug
弹幕
p75 75、商品服务-API-品牌管理-品牌分类关联与级联更新
笔记
疑问
bug
弹幕
p76 76、商品服务-API-平台属性-规格参数新增与VO
笔记
疑问
bug
弹幕
p77 77、商品服务-API-平台属性-规格参数列表
笔记
疑问
bug
弹幕
p78 78、商品服务-API-平台属性-规格修改
笔记
疑问
bug
弹幕
p79 79、商品服务-API-平台属性-销售属性维护
笔记
疑问
bug
弹幕
p80 80、商品服务-API-平台属性-查询分组关联属性&删除关联
笔记
疑问
bug
弹幕
p81 81、商品服务-API-平台属性-查询分组未关联的属性
笔记
疑问
bug
弹幕
p82 82、商品服务-API-平台属性-新增分组与属性关联
笔记
疑问
bug
弹幕
p83 83、商品服务-API-新增商品-调试会员等级相关接口
笔记
疑问
bug
弹幕
p84 84、商品服务-API-新增商品-获取分类关联的品牌
笔记
疑问
bug
弹幕
p85 85、商品服务-API-新增商品-获取分类下所有分组以及属性
笔记
疑问
bug
弹幕
p86 86、商品服务-API-新增商品-商品新增vo抽取
笔记
疑问
bug
弹幕
p87 87、商品服务-API-新增商品-商品新增业务流程分析
笔记
疑问
bug
弹幕
p88 88、商品服务-API-新增商品-保存SPU基本信息
笔记
疑问
bug
弹幕
p89 89、商品服务-API-新增商品-保存SKU基本信息
笔记
疑问
bug
弹幕
p90 90、商品服务-API-新增商品-调用远程服务保存优惠等信息
笔记
疑问
bug
弹幕
p91 91、商品服务-API-新增商品-商品保存debug完成
笔记
疑问
bug
弹幕
p92 92、商品服务-API-新增商品-商品保存其他问题处理
笔记
疑问
bug
弹幕
p93 93、商品服务-API-商品管理-SPU检索
笔记
疑问
bug
弹幕
p94 94、商品服务-API-商品管理-SKU检索
笔记
疑问
bug
弹幕
p95 95、仓储服务-API-仓库管理-整合ware服务&获取仓库列表
笔记
疑问
bug
弹幕
p96 96、仓储服务-API-仓库管理-查询库存&创建采购需求
笔记
疑问
bug
弹幕
p97 97、仓储服务-API-仓库管理-合并采购需求
笔记
疑问
bug
弹幕
p98 98、仓储服务-API-仓库管理-领取采购单
笔记
疑问
bug
弹幕
p99 99、仓储服务-API-仓库管理-完成采购
笔记
疑问
bug
弹幕
p100 100、商品服务-API-商品管理-SPU规格维护
笔记
疑问
bug
弹幕
p101 101、分布式基础篇总结
笔记
疑问
bug
弹幕
p102 102、全文检索-ElasticSearch-简介
笔记
疑问
bug
弹幕
p103 103、全文检索-ElasticSearch-Docker安装ES
笔记
疑问
bug
弹幕
p104 104、全文检索-ElasticSearch-Docker安装Kibana
笔记
疑问
bug
弹幕
p105 105、全文检索-ElasticSearch-入门-_cat
笔记
疑问
bug
弹幕
p106 106、全文检索-ElasticSearch-入门-put&post新增数据
笔记
疑问
bug
弹幕
p107 107、全文检索-ElasticSearch-入门-get查询数据&乐观锁字段
笔记
疑问
bug
弹幕
p108 108、全文检索-ElasticSearch-入门-put&post修改数据
笔记
疑问
bug
弹幕
p109 109、全文检索-ElasticSearch-入门-删除数据&bulk批量操作导入样本测试数据
笔记
疑问
bug
弹幕
p110 110、全文检索-ElasticSearch-进阶-两种查询方式
笔记
疑问
bug
弹幕
p111 111、全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all
笔记
疑问
bug
弹幕
p112 112、全文检索-ElasticSearch-进阶-match全文检索
笔记
疑问
bug
弹幕
p113 113、全文检索-ElasticSearch-进阶-match_phrase短语匹配
笔记
疑问
bug
弹幕
p114 114、全文检索-ElasticSearch-进阶-multi_match多字段匹配
笔记
疑问
bug
弹幕
p115 115、全文检索-ElasticSearch-进阶-bool复合查询
笔记
疑问
bug
弹幕
p116 116、全文检索-ElasticSearch-进阶-filter过滤
笔记
疑问
bug
弹幕
p117 117、全文检索-ElasticSearch-进阶-term查询
笔记
疑问
bug
弹幕
p118 118、全文检索-ElasticSearch-进阶-aggregations聚合分析
笔记
疑问
bug
弹幕
p119 119、全文检索-ElasticSearch-映射-mapping创建
笔记
疑问
bug
弹幕
p120 120、全文检索-ElasticSearch-映射-添加新的字段映射
笔记
疑问
bug
弹幕
p121 121、全文检索-ElasticSearch-映射-修改映射&数据迁移
笔记
疑问
bug
弹幕
p122 122、全文检索-ElasticSearch-分词-分词&安装ik分词
笔记
疑问
bug
弹幕
p123 123、补充-修改linux网络设置&开启root密码访问
笔记
疑问
bug
弹幕
p124 124、全文检索-ElasticSearch-分词-自定义扩展词库
笔记
疑问
bug
弹幕
p125 125、全文检索-ElasticSearch-整合-SpringBoot整合high-level-client
笔记
疑问
bug
弹幕
p126 126、全文检索-ElasticSearch-整合-测试保存
笔记
疑问
bug
弹幕
p127 127、全文检索-ElasticSearch-整合-测试复杂检索
笔记
疑问
bug
弹幕
p128 128、商城业务-商品上架-sku在es中存储模型分析
笔记
疑问
bug
弹幕
p129 129、商城业务-商品上架-nested数据类型场景
笔记
疑问
bug
弹幕
p130 130、商城业务-商品上架-构造基本数据
笔记
疑问
bug
弹幕
p131 131、商城业务-商品上架-构造sku检索属性
笔记
疑问
bug
弹幕
p132 132、商城业务-商品上架-远程查询库存&泛型结果封装
笔记
疑问
bug
弹幕
p133 133、商城业务-商品上架-远程上架接口
笔记
疑问
bug
弹幕
p134 134、商城业务-商品上架-上架接口调试&feign源码
笔记
疑问
bug
弹幕
p135 135、商城业务-商品上架-抽取响应结果&上架测试完成
笔记
疑问
bug
弹幕
p136 136、商城业务-首页-整合thymeleaf渲染首页
笔记
疑问
bug
弹幕
p137 137、商城业务-首页-整合dev-tools渲染一级分类数据
笔记
疑问
bug
弹幕
p138 138、商城业务-首页-渲染二级三级分类数据
笔记
疑问
bug
弹幕
p139 139、商城业务-nginx-搭建域名访问环境一(反向代理配置)
笔记
疑问
bug
弹幕
p140 140、商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
笔记
疑问
bug
弹幕
p141 141、性能压测-压力测试-基本介绍
笔记
疑问
bug
弹幕
p142 142、性能压测-压力测试-Apache JMeter安装使用
笔记
疑问
bug
弹幕
p143 143、性能压测-压力测试-JMeter在windows下地址占用bug解决
笔记
疑问
bug
弹幕
p144 144、性能压测-性能监控-堆内存与垃圾回收
笔记
疑问
bug
弹幕
p145 145、性能压测-性能监控-jvisualvm使用
笔记
疑问
bug
弹幕
p146 146、性能压测-优化-中间件对性能的影响
笔记
疑问
bug
弹幕
p147 147、性能压测-优化-简单优化吞吐量测试
笔记
疑问
bug
弹幕
p148 148、性能压测-优化-nginx动静分离
笔记
疑问
bug
弹幕
p149 149、性能压测-优化-模拟线上应用内存崩溃宕机情况
笔记
疑问
bug
弹幕
p150 150、性能压测-优化-优化三级分类数据获取
笔记
疑问
bug
弹幕
p151 151、缓存-缓存使用-本地缓存与分布式缓存
笔记
疑问
bug
弹幕
p152 152、缓存-缓存使用-整合redis测试
笔记
疑问
bug
弹幕
p153 153、缓存-缓存使用-改造三级分类业务
笔记
疑问
bug
弹幕
p154 154、缓存-缓存使用-压力测试出的内存泄露及解决
笔记
疑问
bug
弹幕
p155 155、缓存-缓存使用-缓存击穿、穿透、雪崩
笔记
疑问
bug
弹幕
p156 156、缓存-缓存使用-加锁解决缓存击穿问题
笔记
疑问
bug
弹幕
p157 157、缓存-缓存使用-本地锁在分布式下的问题
笔记
疑问
bug
弹幕
p158 158、缓存-分布式锁-分布式锁原理与使用
笔记
疑问
bug
弹幕
p159 159、缓存-分布式锁-Redisson简介&整合
笔记
疑问
bug
弹幕
p160 160、缓存-分布式锁-Redisson-lock锁测试
笔记
疑问
bug
弹幕
p161 161、缓存-分布式锁-Redisson-lock看门狗原理-redisson如何解决死锁
笔记
疑问
bug
弹幕
p162 162、缓存-分布式锁-Redisson-读写锁测试
笔记
疑问
bug
弹幕
p163 163、缓存-分布式锁-Redisson-读写锁补充
笔记
疑问
bug
弹幕
p164 164、缓存-分布式锁-Redisson-闭锁测试
笔记
疑问
bug
弹幕
p165 165、缓存-分布式锁-Redisson-信号量测试
笔记
疑问
bug
弹幕
p166 166、缓存-分布式锁-缓存一致性解决
笔记
疑问
bug
弹幕
p167 167、缓存-SpringCache-简介
笔记
疑问
bug
弹幕
p168 168、缓存-SpringCache-整合&体验@Cacheable
笔记
疑问
bug
弹幕
p169 169、缓存-SpringCache-@Cacheable细节设置
笔记
疑问
bug
弹幕
p170 170、缓存-SpringCache-自定义缓存配置
笔记
疑问
bug
弹幕
p171 171、缓存-SpringCache-@CacheEvict
笔记
疑问
bug
弹幕
p172 172、缓存-SpringCache-原理与不足
笔记
疑问
bug
弹幕
p173 173、商城业务-检索服务-搭建页面环境
笔记
疑问
bug
弹幕
p174 174、商城业务-检索服务-调整页面跳转
笔记
疑问
bug
弹幕
p175 175、商城业务-检索服务-检索查询参数模型分析抽取
笔记
疑问
bug
弹幕
p176 176、商城业务-检索服务-检索返回结果模型分析抽取
笔记
疑问
bug
弹幕
p177 177、商城业务-检索服务-检索DSL测试-查询部分
笔记
疑问
bug
弹幕
p178 178、商城业务-检索服务-检索DSL测试-聚合部分
笔记
疑问
bug
弹幕
p179 179、商城业务-检索服务-SearchRequest构建-检索
笔记
疑问
bug
弹幕
p180 180、商城业务-检索服务-SearchRequest构建-排序、分页、高亮&测试
笔记
疑问
bug
弹幕
p181 181、商城业务-检索服务-SearchRequest构建-聚合
笔记
疑问
bug
弹幕
p182 182、商城业务-检索服务-SearchResponse分析&封装
笔记
疑问
bug
弹幕
p183 183、商城业务-检索服务-验证结果封装正确性
笔记
疑问
bug
弹幕
p184 184、商城业务-检索服务-页面基本数据渲染
笔记
疑问
bug
弹幕
p185 185、商城业务-检索服务-页面筛选条件渲染
笔记
疑问
bug
弹幕
p186 186、商城业务-检索服务-页面分页数据渲染
笔记
疑问
bug
弹幕
p187 187、商城业务-检索服务-页面排序功能
笔记
疑问
bug
弹幕
p188 188、商城业务-检索服务-页面排序字段回显
笔记
疑问
bug
弹幕
p189 189、商城业务-检索服务-页面价格区间搜索
笔记
疑问
bug
弹幕
p190 190、商城业务-检索服务-面包屑导航
笔记
疑问
bug
弹幕
p191 191、商城业务-检索服务-条件删除与URL编码问题
笔记
疑问
bug
弹幕
p192 192、商城业务-检索服务-条件筛选联动
笔记
疑问
bug
弹幕
p193 193、商城业务-异步-异步复习
笔记
疑问
bug
弹幕
p194 194、商城业务-异步-线程池详解
笔记
疑问
bug
弹幕
p195 195、商城业务-异步-CompletableFuture
笔记
疑问
bug
弹幕
p196 196、商城业务-异步-CompletableFuture-启动异步任务
笔记
疑问
bug
弹幕
p197 197、商城业务-异步-CompletableFuture-完成回调与异常感知
笔记
疑问
bug
弹幕
p198 198、商城业务-异步-CompletableFuture-handle最终处理
笔记
疑问
bug
弹幕
p199 199、商城业务-异步-CompletableFuture-线程串行化
笔记
疑问
bug
弹幕
p200 200、商城业务-异步-CompletableFuture-两任务组合-都要完成
笔记
疑问
bug
弹幕
p201 201、商城业务-异步-CompletableFuture-两任务组合-一个完成
笔记
疑问
bug
弹幕
p202 202、商城业务-异步-CompletableFuture-多任务组合
笔记
疑问
bug
弹幕
p203 203、商城业务-商品详情-环境搭建
笔记
疑问
bug
弹幕
p204 204、商城业务-商品详情-模型抽取
笔记
疑问
bug
弹幕
p205 205、商城业务-商品详情-规格参数
笔记
疑问
bug
弹幕
p206 206、商城业务-商品详情-销售属性组合
笔记
疑问
bug
弹幕
p207 207、商城业务-商品详情-详情页渲染
笔记
疑问
bug
弹幕
p208 208、商城业务-商品详情-销售属性渲染
笔记
疑问
bug
弹幕
p209 209、商城业务-商品详情-sku组合切换
笔记
疑问
bug
弹幕
p210 210、商城业务-商品详情-异步编排优化
笔记
疑问
bug
弹幕
p211 211、商城业务-认证服务-环境搭建
笔记
疑问
bug
弹幕
p212 212、商城业务-认证服务-好玩的验证码倒计时
笔记
疑问
bug
弹幕
p213 213、商城业务-认证服务-整合短信验证码
笔记
疑问
bug
弹幕
p214 214、商城业务-认证服务-验证码防刷校验
笔记
疑问
bug
弹幕
p215 215、商城业务-认证服务-一步一坑的注册页环境
笔记
疑问
bug
弹幕
p216 216、商城业务-认证服务-异常机制
笔记
疑问
bug
弹幕
p217 217、商城业务-认证服务-MD5&盐值&BCrypt
笔记
疑问
bug
弹幕
p218 218、商城业务-认证服务-注册完成
笔记
疑问
bug
弹幕
p219 219、商城业务-认证服务-账号密码登录完成
笔记
疑问
bug
弹幕
p220 220、商城业务-认证服务-OAuth2.0简介
笔记
疑问
bug
弹幕
p221 221、商城业务-认证服务-weibo登录测试
笔记
疑问
bug
弹幕
p222 222、商城业务-认证服务-社交登录回调
笔记
疑问
bug
弹幕
p223 223、商城业务-认证服务-社交登录完成
笔记
疑问
bug
弹幕
p224 224、商城业务-认证服务-社交登录测试成功
笔记
疑问
bug
弹幕
p225 225、商城业务-认证服务-分布式session不共享不同步问题
笔记
疑问
bug
弹幕
p226 226、商城业务-认证服务-分布式session解决方案原理
笔记
疑问
bug
弹幕
p227 227、商城业务-认证服务-SpringSession整合
笔记
疑问
bug
弹幕
p228 228、商城业务-认证服务-自定义SpringSession完成子域session共享
笔记
疑问
bug
弹幕
p229 229、商城业务-认证服务-SpringSession原理
笔记
疑问
bug
弹幕
p230 230、商城业务-认证服务-页面效果完成
笔记
疑问
bug
弹幕
p231 231、商城业务-认证服务-单点登录简介
笔记
疑问
bug
弹幕
p232 232、商城业务-认证服务-补-框架效果演示
笔记
疑问
bug
弹幕
p233 233、商城业务-认证服务-单点登录流程-1
笔记
疑问
bug
弹幕
p234 234、商城业务-认证服务-单点登录流程-2
笔记
疑问
bug
弹幕
p235 235、商城业务-认证服务-单点登录流程-3
笔记
疑问
bug
弹幕
p236 236、商城业务-购物车-环境搭建
笔记
疑问
bug
弹幕
p237 237、商城业务-购物车-数据模型分析
笔记
疑问
bug
弹幕
p238 238、商城业务-购物车-VO编写
笔记
疑问
bug
弹幕
p239 239、商城业务-购物车-ThreadLocal用户身份鉴别
笔记
疑问
bug
弹幕
p240 240、商城业务-购物车-页面环境搭建
笔记
疑问
bug
弹幕
p241 241、商城业务-购物车-添加购物车
笔记
疑问
bug
弹幕
p242 242、商城业务-购物车-添加购物车细节
笔记
疑问
bug
弹幕
p243 243、商城业务-购物车-RedirectAttribute
笔记
疑问
bug
弹幕
p244 244、商城业务-购物车-获取&合并购物车
笔记
疑问
bug
弹幕
p245 245、商城业务-购物车-选中购物项
笔记
疑问
bug
弹幕
p246 246、商城业务-购物车-改变购物项数量
笔记
疑问
bug
弹幕
p247 247、商城业务-购物车-删除购物项
笔记
疑问
bug
弹幕
p248 247、商城业务-消息队列-MQ简介
笔记
疑问
bug
弹幕
p249 248、商城业务-消息队列-RabbitMQ简介
笔记
疑问
bug
弹幕
p250 249、商城业务-消息队列-RabbitMQ工作流程
笔记
疑问
bug
弹幕
p251 250、商城业务-消息队列-RabbitMQ安装
笔记
疑问
bug
弹幕
p252 251、商城业务-消息队列-Exchange类型
笔记
疑问
bug
弹幕
p253 252、商城业务-消息队列-Direct-Exchange
笔记
疑问
bug
弹幕
p254 253、商城业务-消息队列-Fanout-Exchange
笔记
疑问
bug
弹幕
p255 254、商城业务-消息队列-Topic-Exchange
笔记
疑问
bug
弹幕
p256 255、商城业务-消息队列-SpringBoot整合RabbitMQ
笔记
疑问
bug
弹幕
p257 256、商城业务-消息队列-AmqpAdmin使用
笔记
疑问
bug
弹幕
p258 257、商城业务-消息队列-RabbitTemplate使用
笔记
疑问
bug
弹幕
p259 258、商城业务-消息队列-RabbitListener&RabbitHandler接收消息
笔记
疑问
bug
弹幕
p260 259、商城业务-消息队列-可靠投递-发送端确认
笔记
疑问
bug
弹幕
p261 260、商城业务-消息队列-可靠投递-消费端确认
笔记
疑问
bug
弹幕
p262 261、商城业务-订单服务-页面环境搭建
笔记
疑问
bug
弹幕
p263 262、商城业务-订单服务-整合SpringSession
笔记
疑问
bug
弹幕
p264 263、商城业务-订单服务-订单基本概念
笔记
疑问
bug
弹幕
p265 264、商城业务-订单服务-订单登录拦截
笔记
疑问
bug
弹幕
p266 265、商城业务-订单服务-订单确认页模型抽取
笔记
疑问
bug
弹幕
p267 266、商城业务-订单服务-订单确认页数据获取
笔记
疑问
bug
弹幕
p268 267、商城业务-订单服务-Feign远程调用丢失请求头问题
笔记
疑问
bug
弹幕
p269 268、商城业务-订单服务-Feign异步调用丢失请求头问题
笔记
疑问
bug
弹幕
p270 269、商城业务-订单服务-bug修改
笔记
疑问
bug
弹幕
p271 270、商城业务-订单服务-订单确认页渲染
笔记
疑问
bug
弹幕
p272 271、商城业务-订单服务-订单确认页库存查询
笔记
疑问
bug
弹幕
p273 272、商城业务-订单服务-订单确认页模拟运费效果
笔记
疑问
bug
弹幕
p274 273、商城业务-订单服务-订单确认页细节显示
笔记
疑问
bug
弹幕
p275 274、商城业务-订单服务-接口幂等性讨论
笔记
疑问
bug
弹幕
p276 275、商城业务-订单服务-订单确认页完成
笔记
疑问
bug
弹幕
p277 276、商城业务-订单服务-原子验令牌
笔记
疑问
bug
弹幕
p278 277、商城业务-订单服务-构造订单数据
笔记
疑问
bug
弹幕
p279 278、商城业务-订单服务-构造订单项数据
笔记
疑问
bug
弹幕
p280 279、商城业务-订单服务-订单验价
笔记
疑问
bug
弹幕
p281 280、商城业务-订单服务-保存订单数据
笔记
疑问
bug
弹幕
p282 281、商城业务-订单服务-锁定库存
笔记
疑问
bug
弹幕
p283 282、商城业务-订单服务-提交订单的问题
笔记
疑问
bug
弹幕
p284 283、商城业务-分布式事务-本地事务在分布式下的问题
笔记
疑问
bug
弹幕
p285 284、商城业务-分布式事务-本地事务隔离级别&传播行为等复习
笔记
疑问
bug
弹幕
p286 285、商城业务-分布式事务-分布式CAP&Raft原理
笔记
疑问
bug
弹幕
p287 286、商城业务-分布式事务-BASE
笔记
疑问
bug
弹幕
p288 287、商城业务-分布式事务-分布式事务常见解决方案
笔记
疑问
bug
弹幕
p289 288、商城业务-分布式事务-Seata&环境准备
笔记
疑问
bug
弹幕
p290 289、商城业务-分布式事务-Seata分布式事务体验
笔记
疑问
bug
弹幕
p291 290、商城业务-分布式事务-最终一致性库存解锁逻辑
笔记
疑问
bug
弹幕
p292 291、商城业务-订单服务-RabbitMQ延时队列
笔记
疑问
bug
弹幕
p293 292、商城业务-订单服务-延时队列定时关单模拟
笔记
疑问
bug
弹幕
p294 293、商城业务-订单服务-创建业务交换机&队列
笔记
疑问
bug
弹幕
p295 294、商城业务-订单服务-监听库存解锁
笔记
疑问
bug
弹幕
p296 295、商城业务-订单服务-库存解锁逻辑
笔记
疑问
bug
弹幕
p297 296、商城业务-订单服务-库存自动解锁完成
笔记
疑问
bug
弹幕
p298 297、商城业务-订单服务-测试库存自动解锁
笔记
疑问
bug
弹幕
p299 298、商城业务-订单服务-定时关单完成
笔记
疑问
bug
弹幕
p300 299、商城业务-订单服务-消息丢失、积压、重复等解决方案
笔记
疑问
bug
弹幕
p301 300、商城业务-支付-支付宝沙箱&代码
笔记
疑问
bug
弹幕
p302 301、商城业务-支付-RSA、加密加签、密钥等
笔记
疑问
bug
弹幕
p303 302、商城业务-支付-内网穿透
笔记
疑问
bug
弹幕
p304 303、商城业务-订单服务-整合支付前需要注意的问题
笔记
疑问
bug
弹幕
p305 304、商城业务-订单服务-整合支付
笔记
疑问
bug
弹幕
p306 305、商城业务-订单服务-支付成功同步回调
笔记
疑问
bug
弹幕
p307 306、商城业务-订单服务-订单列表页渲染完成
笔记
疑问
bug
弹幕
p308 307、商城业务-订单服务-异步通知内网穿透环境搭建
笔记
疑问
bug
弹幕
p309 308、商城业务-订单服务-支付完成
笔记
疑问
bug
弹幕
p310 309、商城业务-订单服务-收单
笔记
疑问
bug
弹幕
p311 310、商城业务-秒杀服务-后台添加秒杀商品
笔记
疑问
bug
弹幕
p312 311、商城业务-秒杀服务-定时任务&Cron表达式
笔记
疑问
bug
弹幕
p313 312、商城业务-秒杀服务-SpringBoot整合定时任务与异步任务
笔记
疑问
bug
弹幕
p314 313、商城业务-秒杀服务-时间日期处理
笔记
疑问
bug
弹幕
p315 314、商城业务-秒杀服务-秒杀商品上架-1
笔记
疑问
bug
弹幕
p316 315、商城业务-秒杀服务-秒杀商品上架-2
笔记
疑问
bug
弹幕
p317 316、商城业务-秒杀服务-秒杀商品上架-3
笔记
疑问
bug
弹幕
p318 317、商城业务-秒杀服务-幂等性保证
笔记
疑问
bug
弹幕
p319 318、商城业务-秒杀服务-查询秒杀商品
笔记
疑问
bug
弹幕
p320 319、商城业务-秒杀服务-秒杀页面渲染
笔记
疑问
bug
弹幕
p321 320、商城业务-秒杀服务-秒杀系统设计
笔记
疑问
bug
弹幕
p322 321、商城业务-秒杀服务-登录检查
笔记
疑问
bug
弹幕
p323 322、商城业务-秒杀服务-秒杀流程
笔记
疑问
bug
弹幕
p324 323、商城业务-秒杀服务-秒杀效果完成
笔记
疑问
bug
弹幕
p325 324、商城业务-秒杀服务-秒杀页面完成
笔记
疑问
bug
弹幕
p326 325、Sentinel-高并发方法论&简介
笔记
疑问
bug
弹幕
p327 326、Sentinel-基本概念
笔记
疑问
bug
弹幕
p328 327、Sentinel-整合SpringBoot
笔记
疑问
bug
弹幕
p329 328、Sentinel-自定义流控响应
笔记
疑问
bug
弹幕
p330 329、Sentinel-全服务引入
笔记
疑问
bug
弹幕
p331 330、Sentinel-流控模式&效果
笔记
疑问
bug
弹幕
p332 331、Sentinel-熔断降级
笔记
疑问
bug
弹幕
p333 332、Sentinel-自定义受保护资源
笔记
疑问
bug
弹幕
p334 333、Sentinel-网关流控
笔记
疑问
bug
弹幕
p335 334、Sentinel-定制网关流控返回
笔记
疑问
bug
弹幕
p336 335、Sleuth-链路追踪-基本概念&整合
笔记
疑问
bug
弹幕
p337 336、Sleuth-链路追踪-整合Zipkin效果
笔记
疑问
bug
弹幕
p338 337、Sleuth-链路追踪-Zipkin界面分析
笔记
疑问
bug
弹幕
p339 338、分布式高级篇总结
笔记
疑问
bug
弹幕
p340 339、k8s-简介
笔记
疑问
bug
弹幕
p341 340、k8s-架构原理&核心概念
笔记
疑问
bug
弹幕
p342 341、k8s-集群搭建-环境准备
笔记
疑问
bug
弹幕
p343 342、k8s-集群搭建-创建三个虚拟机
笔记
疑问
bug
弹幕
p344 343、k8s-集群搭建-NAT网络和前置环境
笔记
疑问
bug
弹幕
p345 344、k8s-集群搭建-安装Docker、kubelet、kubeadm、kubectl
笔记
疑问
bug
弹幕
p346 345、k8s-集群搭建-集群安装完成
笔记
疑问
bug
弹幕
p347 346、k8s-入门-基本操作体验
笔记
疑问
bug
弹幕
p348 347、k8s-入门-yaml&基本使用
笔记
疑问
bug
弹幕
p349 348、k8s-入门-Pod、Service等概念
笔记
疑问
bug
弹幕
p350 349、k8s-入门-Ingress
笔记
疑问
bug
弹幕
p351 350、kubesphere-安装-前置环境
笔记
疑问
bug
弹幕
p352 351、kubesphere-安装-最小化安装完成
笔记
疑问
bug
弹幕
p353 352、kubesphere-安装-定制化安装&界面介绍
笔记
疑问
bug
弹幕
p354 353、kubesphere-进阶-建立多租户系统
笔记
疑问
bug
弹幕
p355 354、kubesphere-进阶-创建WordPress应用-密钥
笔记
疑问
bug
弹幕
p356 355、kubesphere-进阶-创建WordPress应用-创建容器
笔记
疑问
bug
弹幕
p357 356、kubesphere-进阶-创建WordPress应用-外网访问
笔记
疑问
bug
弹幕
p358 357、kubesphere-进阶-什么是DevOps
笔记
疑问
bug
弹幕
p359 358、kubesphere-进阶-流水线-创建凭证
笔记
疑问
bug
弹幕
p360 359、kubesphere-进阶-流水线-CICD完整体验
笔记
疑问
bug
弹幕
p361 360、集群-集群常见的基本形式
笔记
疑问
bug
弹幕
p362 361、集群-MySQL-常见集群形式
笔记
疑问
bug
弹幕
p363 362、集群-MySQL-主从同步
笔记
疑问
bug
弹幕
p364 363、集群-ShardingSphere-简介
笔记
疑问
bug
弹幕
p365 364、集群-ShardingSphere-分库分表&读写分离配置
笔记
疑问
bug
弹幕
p366 365、集群-Redis-Cluster基本原理
笔记
疑问
bug
弹幕
p367 366、集群-Redis-Cluster集群搭建
笔记
疑问
bug
弹幕
p368 367、集群-ElasticSearch-集群原理
笔记
疑问
bug
弹幕
p369 368、集群-ElasticSearch-集群搭建
笔记
疑问
bug
弹幕
p370 369、集群-RabbitMQ-镜像集群搭建
笔记
疑问
bug
弹幕
p371 370、部署-如何在k8s上部署有状态应用
笔记
疑问
bug
弹幕
p372 371、部署-k8s部署MySQL
笔记
疑问
bug
弹幕
p373 372、部署-k8s部署Redis
笔记
疑问
bug
弹幕
p374 373、部署-k8s部署ElasticSearch&Kibana
笔记
疑问
bug
弹幕
p375 374、部署-k8s部署RabbitMQ
笔记
疑问
bug
弹幕
p376 375、部署-k8s部署Nacos
笔记
疑问
bug
弹幕
p377 376、部署-k8s部署Zipkin
笔记
疑问
bug
弹幕
p378 377、部署-k8s部署Sentinel
笔记
疑问
bug
弹幕
p379 378、部署-k8s部署应用的流程
笔记
疑问
bug
弹幕
p380 379、部署-生产环境配置抽取
笔记
疑问
bug
弹幕
p381 380、部署-创建微服务Dockerfile
笔记
疑问
bug
弹幕
p382 381、部署-创建微服务k8s部署描述文件
笔记
疑问
bug
弹幕
p383 382、部署-理解targetPort、Port、NodePort
笔记
疑问
bug
弹幕
p384 383、流水线-第一步-gitee拉取代码
笔记
疑问
bug
弹幕
p385 384、流水线-第一步-参数化构建&环境变量
笔记
疑问
bug
弹幕
p386 385、流水线-第二步-Sonar代码质量分析
笔记
疑问
bug
弹幕
p387 386、流水线-第二步-Sonar代码质量分析-调试完成
笔记
疑问
bug
弹幕
p388 387、流水线-第三步-构建&推送镜像
笔记
疑问
bug
弹幕
p389 388、流水线-第四步-流水线编写完成
笔记
疑问
bug
弹幕
p390 389、部署-移植数据库
笔记
疑问
bug
弹幕
p391 390、流水线-流水线细节优化&解决OOM
笔记
疑问
bug
弹幕
p392 391、流水线-流水线部署所有微服务
笔记
疑问
bug
弹幕
p393 392、部署-Docker镜像操作
笔记
疑问
bug
弹幕
p394 393、部署-整合阿里云镜像仓库
笔记
疑问
bug
弹幕
p395 394、部署-Jenkins修改阿里云镜像仓库
笔记
疑问
bug
弹幕
p396 395、流水线-部署gateway
笔记
疑问
bug
弹幕
p397 396、流水线-部署auth-server
笔记
疑问
bug
弹幕
p398 397、流水线-部署cart
笔记
疑问
bug
弹幕
p399 398、流水线-部署coupon
笔记
疑问
bug
弹幕
p400 399、流水线-部署完成&bug修改
笔记
疑问
bug
弹幕
p401 400、流水线-修改为公有仓库
笔记
疑问
bug
弹幕
p402 401、最终部署-第一次部署前置nginx
笔记
疑问
bug
弹幕
p403 402、最终部署-创建网关与应用路由
笔记
疑问
bug
弹幕
p404 403、最终部署-商城系统上线
笔记
疑问
bug
弹幕
p405 404、最终部署-部署vue项目
笔记
疑问
bug
弹幕
p406 405、最终部署-测试滚动更新部署admin-vue-app
笔记
疑问
bug
弹幕
p407 406、线上预警与监控
笔记
疑问
bug
弹幕
p408 407、集群部署篇-总结
笔记
疑问
bug
弹幕
硬件
主板
ROG MAXIMUS X HERO (WI-FI AC)
听见自己声音就是声卡驱动
图片详情

cpu
CPU温度检测
图片详情

内存
天梯图
天梯图

xmp
近日发现自己3000mhz的内存条在资源管理器里面显示只有2133mhz
原来是因为xmp没开
加内存条
今日发现内存不够用了,便寻思着需要加一个根内存条
按照华硕官方的建议指导手册的建议来插发现,点亮之后发现并没有成功识别第二根内存条(两根内存条参数完全一致)
后来发现有可能是插的不牢固(参考文献)
发现真的没插牢,插内存条的时候听见「柯登」一声响,就插牢了
后来发现没点亮,主板的错误码是CC,主板说明书里面也没有描述这个错误
将两根内存条交换反插,发现能成功点亮
点亮之后,报下面这个信息
图片详情

原来是我开了xmp,F1 重新确认一遍xmp的设置就好了(他会警告你最好cpu要带水冷),F10保存设置并退出,就成功了!
图片详情

加了内存条超过16gb之后会比较卡顿
关掉虚拟内存
通过systeminfo查看还是有虚拟内存
代码详情
1 | 物理内存总量: 32,619 MB |
设置最佳性能
图片详情

硬盘
cmr和pmr之争论
希捷
酷狼价格
图片详情

显卡
OC: 自动超频
3080ti
华硕高端
ROG-STRIX-LC-RTX3080TI-O12G-GAMING
cache
图片详情

解析
图片详情

- 注意组号的计算
显示器
AOC
显示器有颜色配置文件
Q2490PXQ
vocabulary
单词
颜色标记
红色,生词
绿色,疏意
100个句子记完5500个考研单词
Sentence 01
We become defensive when criticised, and apply negative $\color{red}{\text{stereotypes}}$ to others to boost our own $\color{red}{\text{esteem}}$.
一旦受到批评,我们就会为自己辩护,并将他人定格为消极的老套形 象,以此增强自己的自尊心。
Sentence 02
Devoted $\color{green}{\text{concertgoers}}$ who reply that recordings are no substitute for live performance are missing the point.
那些忠诚的$\color{green}{\text{音乐会听众}}$回应说现场演出绝非是唱片所能替代的,可这些听众没有领会到问题的关键点。
Sentence 03
Ants keep $\color{red}{\text{predatory}}$ insects away from where their $\color{red}{\text{aphids}}$ feed; Gmail keeps the $\color{red}{\text{spammers}}$ out of our inboxes.
蚂蚁让$\color{red}{\text{食肉昆虫}}$远离$\color{red}{\text{蚜虫}}$进食的地方;谷歌邮箱让$\color{red}{\text{滥发垃圾邮件的人}}$远离我们的收件箱。
Sentence 04
At the same time, people continue to treat fire as an event that needs to be wholly controlled and $\color{red}{\text{unleashed}}$ only out of necessity.
与此同时,人们继续把用火视为一种需要全面控制的事件,只有在必要之时才$\color{red}{\text{放出来}}$使用。
Sentence 05
As boards $\color{red}{\text{scrutinize}}$ succession plans in response to shareholder pressure, executives who don’t get the nod also may wish to move on.
在董事会迫于股东的压力严格$\color{red}{\text{审查}}$继任计划的时候,那些没被选中的高管们也可能想离开。
Sentence 06
Everyone needs to find their extra—their unique value contribution that makes them stand out in whatever is their field of employment.
人人都需要找到自己的额外价值——让自己在任何所在$\color{green}{\text{职业领域}}$中都脱颖而出的独特价值贡献。
Sentence 07
It is also the reason why when we try to describe music with words, all we can do is $\color{red}{\text{articulate}}$ our reactions to it, and not grasp music itself.
这也是为什么当我们试图用语言来描述音乐时,我们所能做的只能是$\color{red}{\text{说清楚}}$对音乐的感受,而不能理解音乐本身。
Sentence 08
Scientists jumped to the rescue with some distinctly $\color{red}{\text{shaky}}$ evidence to $\color{green}{\text{the effect}}$ that insects would eat us up if birds failed to control them.
科学家们立即拿出某些明显$\color{red}{\text{站不住脚}}$的证据前来“救驾”,其大意是说如果鸟儿不能控制这些昆虫的数量的话,昆虫就会吃光一切。(the effect 后果)
Sentence 09
A moralist, satirist, and social reformer, Dickens crafted complex plots and $\color{red}{\text{striking}}$ characters that capture the $\color{red}{\text{panorama}}$ of English society.
作为一位道德家、讽刺作家和社会改革家,狄更斯精心设计了复杂的情节和$\color{red}{\text{引人注目}}$的人物,捕捉了英国社会的$\color{red}{\text{全貌}}$。
Sentence 10
Half a century of town and country planning has enabled it to $\color{red}{\text{retain}}$ an enviable rural $\color{red}{\text{coherence}}$, while still permitting low-density urban living.
半个世纪的城乡规划使其(英国)得以$\color{red}{\text{保留}}$令人羡慕的乡村$\color{red}{\text{和谐}}$,同时仍允许低密度的城镇生活。
Sentence 11
$\color{red}{\text{Integrity}}$ had collapsed, she argued, because of a collective acceptance that the only “sorting mechanism” in society should be profit and the market.
她认为,$\color{red}{\text{诚信}}$已瓦解,因为我们集体接受的观念是,社会中唯一的“分选机制”应该是利润和市场。
Sentence 12
We need them to imagine the United States as a place where they can be productive for a while without committing themselves to staying forever.
我们需要他们把美国想象为这样一个地方,在这里他们可以在一段时间内创造价值,而无需承诺永久居留于此。
Sentence 13
The $\color{green}{\text{issue}}$ of $\color{green}{\text{voluntary part-time}}$ relates to $\color{red}{\text{Obamacare}}$ because one of the main purposes was to allow people to get insurance $\color{green}{\text{outside of employment}}$.
$\color{green}{\text{自愿兼职工作}}$这一$\color{green}{\text{问题}}$与奥巴马医改计划相关联,因为该计划的主要目的之一就是让人们$\color{green}{\text{不就业}}$也能得到医疗保险。
Sentence 14
Firms are now studying how genes interact, looking for $\color{green}{\text{correlations}}$ that might be used to determine the causes of disease or predict a drug’s $\color{green}{\text{efficacy}}$.
一些公司正在研究基因是如何相互作用的,寻找可能用来确定病因或者预测药物$\color{green}{\text{疗效}}$的$\color{green}{\text{相关性}}$。
Sentence 15
$\color{green}{\text{Dead markets}}$ partly reflect the $\color{green}{\text{paralysis}}$ of banks which will not sell assets for fear of $\color{green}{\text{booking losses}}$, yet are reluctant to buy all those $\color{green}{\text{supposed bargains}}$.
$\color{green}{\text{毫无活力的市场}}$一定程度上反映了银行系统的$\color{green}{\text{瘫痪}}$,由于担心$\color{green}{\text{账面损失}}$,银行不会出售资产,但也不愿意收购那些所谓的$\color{green}{\text{廉价资产}}$。
Sentence 16
He adds $\color{red}{\text{humbly}}$ that perhaps he was “superior to the $\color{green}{\text{common run of men}}$ in noticing things which easily escape attention, and in observing them carefully”.
他$\color{red}{\text{谦虚地}}$补充道,或许他“优于$\color{green}{\text{常人}}$的地方在于能够注意到容易被忽视的东西,并对这些东西进行仔细观察”。
Sentence 17
Many leading American universities want their undergraduates to have a $\color{red}{\text{grounding}}$ in the basic $\color{red}{\text{canon}}$ of ideas that every educated person should $\color{green}{\text{possess}}$.
许多顶尖的美国大学都希望他们的本科生接受对一些基本的、富含思想的经典作品的$\color{red}{\text{基础教学}}$,这些思想是每个受教育人士都$\color{green}{\text{应该有}}$的。($\color{red}{\text{canon}}$:原则)
- 研究生 postgraduate
- 硕士 master
- 博士 doctor
- 学士 bachelor
- 博士后 post doctor
Sentence 18
Buying gifts or giving to charity is often more pleasurable than purchasing things for oneself, and luxuries are most enjoyable when they are consumed $\color{red}}{\text{sparingly}}$.
买礼物或给慈善机构捐款往往会比给自己买东西更让人开心,$\color{red}{\text{有节制地}}$消费奢侈品才会给人以最大的愉悦。
Sentence 19
These $\color{red}{\text{benefactors}}$ have succeeded in their chosen fields, they say, and they want to use their wealth to draw attention to those who have succeeded in science.
他们说,这些$\color{red}{\text{捐助者}}$在各自所选择的领域都很成功,而且他们想用自己的财富让人们注意到那些在科学领域有所成就的人。
Sentence 20
Perhaps $\color{red}{\text{faintly}}$, they hint that people should look to $\color{red}{\text{intangible}}$ qualities like character and intellect rather than $\color{green}{\text{dieting their way}}$ to $\color{green}{\text{size zero}}$ or $\color{red}{\text{wasp}}$-$\color{red}{\text{waist}}$ $\color{red}{\text{physiques}}$.
这些禁令或许还$\color{red}{\text{隐约地}}$暗示,人们应该注重如个性和才智等$\color{red}{\text{无形}}$的品质,而不是$\color{green}{\text{通过节食}}$来达到“$\color{green}{\text{零号身材}}$”或“$\color{red}{\text{蜂}}$ $\color{red}{\text{腰}}$ $\color{red}{\text{体型}}$”。
Sentence 21
The Navy Department moved into the $\color{green}{\text{east wing}}$ in 1879, where $\color{red}{\text{elaborate}}$ wall and ceiling $\color{red}{\text{stenciling}}$ and $\color{red}{\text{marquetry}}$ floors decorated the office of the $\color{green}{\text{Secretary}}$.
海军部门于1879年搬进了$\color{green}{\text{东翼}}$,在那里,$\color{red}{\text{精心制作}}$的墙壁、天花板上的$\color{red}{\text{镂花涂装}}$和$\color{red}{\text{镶嵌工艺}}$地板装饰着$\color{green}{\text{部长}}$办公室。
Sentence 22
The researchers mapped not only the city’s vast and $\color{red}{\text{ornate}}$ $\color{green}{\text{ceremonial areas}}$, but also hundreds of simpler $\color{green}{\text{apartment complexes}}$ where common people lived.
研究人员不仅绘制了这座城市广阔且$\color{red}{\text{装饰华丽}}$的$\color{green}{\text{庆典区}}$,还绘制了数百个普通民众居住的简单公寓$\color{green}{\text{建筑群}}$。
Sentence 23
It may be said that the measure of the worth of any social institution is its effect in enlarging and improving $\color{green}{\text{experience}}$, but this effect is not a part of its $\color{green}{\text{original motive}}$.
可以说,衡量任何社会制度价值的标准是其在扩大和改进$\color{green}{\text{经验}}$上的成效,但这种成效并不是其$\color{green}{\text{最初动机}}$的一部分。
Sentence 24
Our mental health doesn’t really $\color{green}{\text{go anywhere}}$; like the sun behind a cloud, it can be temporarily hidden from view, but it is fully capable of being restored in an instant.
我们的心理健康并不是真的$\color{green}{\text{消失不见}}$了;就像云朵背后的太阳,它也许暂时被遮挡,但是它完全可以在瞬间重焕光芒。
Sentence 25
No boy who went to a grammar school could be ignorant that the drama was a form of literature which gave glory to Greece and Rome and might yet bring honor to England.
每个进入文法学校学习的学生都知道,戏剧是一种文学形式,这种文学形式赋予希腊和罗马以荣光,并且可能也会为英国带来荣耀。
Sentence 26
The most loyal customers would still get the product they favor, the idea goes, and they’d feel like they were helping $\color{green}{\text{sustain}}$ the quality of something they believe in.
这个想法是这样:那些最忠诚的顾客依旧会购买他们喜欢的产品,他们会觉得这是在帮助$\color{green}{\text{维护}}$他们所信任的产品的品质。
Sentence 27
But policymakers who refocus efforts on $\color{green}{\text{improving well-being}}$ rather than simply worrying about GDP figures could avoid the forecasted $\color{green}{\text{doom}}$ and may even see progress.
但是那些重新致力于$\color{green}{\text{改善福祉}}$,而不仅仅是担心国内生产总值数据的决策者们,就能够避免可预见的$\color{green}{\text{厄运}}$,甚至可能看到进步。
Sentence 28
Indeed, there is something a little $\color{green}{\text{absurd}}$ in the state getting involved in the planning of such a fundamentally “grassroots” concept $\color{green}{\text{as}}$ community sports associations.
确实,让国家参与$\color{green}{\text{像}}$社区体育协会这样从根本上带有“草根阶层”意味的规划是有些$\color{green}{\text{荒唐}}$的。
Sentence 29
While few $\color{green}{\text{craftsmen}}$ or farmers, let alone $\color{green}{\text{dependents}}$ and servants, left $\color{green}{\text{literary compositions}}$ to be analyzed, it is obvious that their views were less fully $\color{green}{\text{intellectualized}}$.
尽管很少有$\color{green}{\text{工匠}}$或农场主能留下可供分析的文学作品,更不用说他们的随从和佣人了,但很明显他们的观点并不十分$\color{green}{\text{理性}}$。
Sentence 30
While comment and reaction from lawyers may enhance $\color{green}{\text{stories}}$, it is preferable for journalists to rely on their own notions of significance and make their own judgments.
尽管来自律师们的评论和反馈可能会提高$\color{green}{\text{新闻报道}}$的质量,但新闻记者最好还是依靠自己对事件重要性的认识而做出自己的判断。
Sentence 31
Social media allows users to experience news events more $\color{green}{\text{intimately}}$ and immediately while also permitting them to re-share news as a projection of their values and interests.
社交媒体允许用户$\color{green}{\text{更密切}}$、更迅速地体验新闻事件,同时也允许他们将新闻作为自己价值观和兴趣的投射而重新分享。
Sentence 32
According to research from Princeton University, people $\color{green}{\text{assess}}$ your $\color{green}{\text{competence}}$, $\color{green}{\text{trustworthiness}}$, and $\color{green}{\text{likeability}}$ in just $\color{green}{\text{a tenth of a second}}$, $\color{green}{\text{solely}}$ based on the way you look.
根据普林斯顿大学的研究,人们会在仅仅$\color{green}{\text{十分之一秒}}$的时间内,$\color{green}{\text{仅}}$根据你的外表去$\color{green}{\text{评判}}$你的$\color{green}{\text{能力}}$、$\color{green}{\text{可信度}}$及你$\color{green}{\text{受人喜欢的程度}}$。
Sentence 33
Some $\color{green}{\text{attributed}}$ virtually every important cultural achievement $\color{green}{\text{to}}$ the inventions of a few, especially gifted peoples that, according to $\color{red}{\text{diffusionists}}$, then spread to other cultures.
有些人$\color{green}{\text{认为}}$,几乎每一项重要的文化成就都是由少数特别有天赋的民族所发明创造的,根据$\color{red}{\text{传播论者}}$的看法,这些发明后来传播到了其他的文化中。
Sentence 34
The $\color{green}{\text{upside}}$ is the possibilities $\color{green}{\text{contained in}}$ knowing that everything is up to us; where before we were $\color{green}{\text{experts in}}$ the array of limitations, now we become $\color{green}{\text{authorities}}$ of what is possible.
积极的一面是,既然万事都取决于我们,那么就有无限可能。以前,我们能够$\color{green}{\text{熟练应对}}$种种局限;现在,我们$\color{green}{\text{把握着}}$未来的可能。
- contained in = because
Sentence 35
If people in the network just two $\color{green}{\text{degrees}}$ removed from the initial influential prove $\color{red}{\text{resistant}}$, $\color{green}{\text{for example}}$, the $\color{red}{\text{cascade}}$ of change won’t $\color{red}{\text{propagate}}$ very far or affect many people.
例如,如果在这一社交网络中与最初的影响者存在$\color{green}{\text{两个层级}}$的人们表现出$\color{red}{\text{抵制}}$的话,$\color{green}{\text{那么}}$这$\color{red}{\text{一连串}}$的变化就不会$\color{red}{\text{传播}}$很远或影响许多人。
- remove 和 in 同义?
Sentence 36
In a workplace that’s $\color{green}{\text{fundamentally}}$ indifferent to your life and its meaning, office speak can help you figure out how you relate to your work—and how your work defines who you are.
在一个$\color{green}{\text{根本}}$不关心你的生活及其意义的职场中,办公室用语能帮助你理清自己和工作的关系,以及工作对你的身份的定义。
Sentence 37
Conversations are links, which means when you have a conversation with a new person a link gets formed and every conversation you have after that moment will strengthen the link.
交谈是一种联系,这意味着当你和一个刚认识的人交谈时,一种联系就形成了,而在那之后的每一次交谈都会强化这一联系。
Sentence 38
Researchers measured people’s $\color{red}{\text{cortisol}}$, which is a stress marker, while they were at work and while they were at home and found it higher at what $\color{green}{\text{is supposed to}}$ be a place of $\color{red}{\text{refuge}}$.
研究人员测量了人们在工作和在家时的皮质醇,它是一种压力标志,并发现在家这个$\color{green}{\text{理应是}}$ $\color{red}{\text{庇护所}}$的地方,人们的皮质醇水平更高。
Sentence 39
While Washington and Jefferson privately expressed $\color{red}{\text{distaste}}$ for slavery, they also understood that it was part of the political and economic $\color{red}{\text{bedrock}}$ of the country they helped to create.
尽管华盛顿和杰斐逊私下都表达过对奴隶制的$\color{red}{\text{不满}}$,但是他们也明白,奴隶制是他们帮助创建的这个国家的政治和经济$\color{red}{\text{基础}}$的一部分。
Sentence 40
When younger kids learn computer science, they learn that it’s not just a confusing, endless string of letters and numbers—but a tool to build apps, or create artwork, or test $\color{green}{\text{hypotheses}}$.
当小孩子们学习计算机科学的时候,他们会发现它并不仅仅是一串令人困惑的、无穷无尽的字母和数字——它还是一种工具,这种工具能编写应用程序、创作艺术作品或测试$\color{green}{\text{假设}}$。
Sentence 41
The Industrial Revolution didn’t go so well for Luddites whose jobs were displaced by mechanized $\color{red}{\text{looms}}$, but it eventually raised living standards and created more jobs than it destroyed.
尽管工业革命在工作被机械化$\color{red}}{\text{织布机}}$取代的卢德派分子中进展并不顺利,但它最终提高了生活水平,并创造了比被它摧毁的工作岗位更多的就业机会。
Sentence 42
That $\color{green}{\text{ruling}}$ produced an explosion in business-method patent $\color{red}{\text{filings}}$, $\color{green}{\text{initially by}}$ $\color{green}{\text{emerging}}$ internet companies trying to $\color{green}{\text{stake out}}$ $\color{green}{\text{exclusive}}$ rights to specific types of online $\color{green}{\text{transactions}}$.
那项$\color{green}{\text{裁决}}$使得商业方法专利$\color{red}{\text{申请文件(备案)}}$数量激增,$\color{green}{\text{起初}}$只是一些$\color{green}{\text{新兴}}$的网络公司试图$\color{green}{\text{抢占}}$对某些特定类型的在线$\color{green}{\text{交易}}$方法的$\color{green}{\text{独家}}$专有权。
Sentence 43
Even though there is plenty of evidence that the quality of the teachers is the most important variable, teachers’ unions have fought against $\color{green}{\text{getting rid of}}$ bad ones and promoting good ones.
虽然有充分的证据表明,教师素质是最重要的可变因素,但是教师工会却反对$\color{green}{\text{开除}}$差教师、提拔好教师。
Sentence 44
Yet most ancestry testing only considers a single $\color{red}{\text{lineage}}$, either the Y chromosome inherited through men in a father’s line or $\color{red}{\text{mitochondrial}}$ DNA, which is passed down only from mothers.
然而,大多数血统检测只考虑单一的$\color{red}{\text{血统}}$,要么只考虑来自父亲的男性遗传的Y染色体,要么只考虑从母亲那里遗传的$\color{red}{\text{线粒体}}$DNA。
Sentence 45
Moreover, even though humans have been $\color{red}{\text{upright}}$ for millions of years, our feet and back continue to struggle with $\color{red}{\text{bipedal}}$ posture and cannot easily $\color{red}{\text{withstand}}$ $\color{green}{\text{repeated}}$ $\color{red}{\text{strain}}$ $\color{red}{\text{imposed}}$ by $\color{green}{\text{oversize limbs}}$.
此外,尽管人类$\color{red}{\text{直立}}$行走已达数百万年之久,但是我们的双脚和背部仍然在与$\color{red}{\text{两足行走}}$的姿势作斗争,并且很难$\color{red}{\text{承受}}$ $\color{green}{\text{过长的四肢}}$ $\color{red}{\text{施加}}$的$\color{green}{\text{持续}}$ $\color{red}{\text{压力}}$。
Sentence 46
While the researchers assumed that the well-structured daily plans would be most effective when it came to the execution of tasks, they were wrong: the detailed daily plans $\color{green}{\text{demotivated}}$ students.
尽管研究人员认为,在执行任务时,详尽的每日目标是最为高效的,但他们错了,详细的每日计划使学生$\color{green}{\text{失去了动力}}$。
Sentence 47
While fossil fuels—coal, oil,$\color{red}{\text{ gas—still}}$ generate roughly 85 percent of the world’s energy supply, it’s clearer than ever that the future belongs to renewable sources such as wind and solar.
虽然化石燃料——煤、石油、天然气——仍然占据世界能源供应的85%左右,但比以往任何时候都更明显的是,未来属于风能和太阳能等可再生能源。
Sentence 48
Only if the $\color{green}{\text{jobless}}$ arrive at the jobcentre with a CV, register for online job search, and start looking for work will they be $\color{red}{\text{eligible}}$ for benefit—and then they should report weekly rather than fortnightly.
只有当$\color{green}{\text{失业者}}$带着简历来到就业服务中心,注册在线求职,并开始寻找工作,他们才有$\color{red}{\text{资格}}$获得补助金,然后他们应该每周而不是每两周汇报一次求职情况。
Sentence 49
It is not that pink is $\color{green}{\text{intrinsically}}$ bad, but it is such a tiny slice of the rainbow and, though it may $\color{red}{\text{celebrate}}$ girlhood in one way, it also repeatedly and firmly $\color{red}{\text{fuses}}$ girls’ identity to appearance.
究其本质,粉红色$\color{green}{\text{本身}}$并没有什么不好,它只不过是彩虹上微小的一抹。虽然从某种程度上来说它$\color{red}{\text{歌颂}}$了少女时代,但它也反复且坚定地把女孩的个性和外表$\color{red}{\text{融合起来。
}}$
Sentence 50
Here, Darwinism seems to offer $\color{green}{\text{justification}}$, for if all humans share common origins, it seems reasonable to suppose that cultural diversity could also be traced to more $\color{green}{\text{constrained}}$ beginnings.
在此,达尔文学说似乎给出了$\color{green}{\text{合理化的解释(正当理由)}}$,这是因为如果整个人类有相同的起源,那么我们就有理由认为,文化多样性同样也可以追溯到更为$\color{green}{\text{有限}}$的开端。
Sentence 51
If you are working on a word processor, you can take advantage of its capacity to make additions and deletions as well as move entire paragraphs by making just a few simple keyboard commands.
如果你正借助文字处理软件进行工作,只需通过几个简单的键盘指令,你就可以利用它来进行删减、增加或移动整段文字。
Sentence 52
This success, coupled with later research showing that memory itself is not genetically determined, led Ericsson to conclude that the act of memorizing is more of a cognitive exercise than an $\color{green}{\text{intuitive}}$ one.
这次的成功,加上后来表明记忆本身不由基因决定的研究,让埃里克森得出结论:记忆行为与其说是一种$\color{green}{\text{直觉性的活动}}$,不如说是一种认知性的活动。
Sentence 53
That’s because Congress has always $\color{red}{\text{envisioned}}$ joint federal-state immigration $\color{green}{\text{enforcement}}$ and $\color{green}{\text{explicitly}}$ encourages state officers to share information and cooperate with federal colleagues.
那是因为美国国会一直$\color{red}{\text{希望}}$联邦政府能与州政府联合$\color{green}{\text{执行(执行,实施)移民法案}}$,并$\color{green}{\text{明确}}$鼓励州政府官员与联邦政府的同事加强合作、信息共享。
Sentence 54
Ministers should also look at creating greater $\color{green}{\text{certainty}}$ in the $\color{red}{\text{rental environment}}$, which would have a significant impact on the ability of registered providers to $\color{green}{\text{fund new developments}}$ from $\color{green}{\text{revenues}}$.
部长们也应该考虑提高房屋$\color{red}{\text{租赁市场}}$的$\color{green}{\text{稳定性}}$,这对注册供应商从$\color{green}{\text{收入}}$中拨出资金来$\color{green}{\text{进行新的开发会}}$产生重大的影响。
Sentence 55
Such $\color{green}{\text{hijacked media}}$ are the opposite of earned media: an asset or $\color{green}{\text{campaign}}$ becomes $\color{red}{\text{hostage}}$ to consumers, other stakeholders, or $\color{green}{\text{activists}}$ who make negative $\color{green}{\text{allegations}}$ about a brand or product.
这种被操纵的媒体和免费媒体完全不同:一项资产或一场$\color{green}{\text{活动( 运动(为社会、商业或政治目的而进行的一系列有计划的活动);战役)}}$受那些对某个品牌或产品有不满$\color{green}{\text{说法(无证据的说法,指控)}}$的消费者、其他利益相关者或$\color{green}{\text{积极分子}}$所$\color{red}{\text{左右(人质)}}$。
Sentence 56
The policy follows similar efforts from other journals, after widespread concern that basic mistakes in data analysis are contributing to the irreproducibility of many published research findings.
这项政策效仿了与其他杂志类似的尝试,此前人们普遍担忧数据分析中的基本错误正导致许多已发表的研究结果无法被再现。
Sentence 57
They should $\color{red}{\text{exhibit}}$ strong interest and respect for whatever currently interests their $\color{red}{\text{fledgling}}$ adult (as $\color{green}{\text{naive}}$ or ill $\color{green}{\text{conceived}}$ as it may seem) while becoming a partner in exploring options for the future.
对当前让这些$\color{green}{\text{羽翼未丰}}$的成年人感兴趣的任何事物(也许看上去很$\color{green}{\text{幼稚}}$或欠$\color{green}{\text{考虑(想象)}}$周全),父母都应该表现出强烈的兴趣和尊重,同时要成为他们的伙伴,与他们一起探索未来的选择。
Sentence 58
In other words, at a time when the working class has turned the country on its political head, frustrated that the opportunity that once defined America is vanishing, one obvious solution is $\color{green}{\text{staring}}$ us in the face.
换句话说,在工人阶级彻底改变这个国家的政治格局,对曾经使美国之所以成为美国的机会正在消失而感到沮丧的时候,一个显而易见的解决方案就$\color{green}{\text{摆( 盯着看; 凝视; 注视; )}}$在我们面前。
Sentence 59
Brain researchers have discovered that when we $\color{green}{\text{consciously}}$ develop new habits, we create parallel $\color{green}{\text{synaptic}}$ paths, and even entirely new brain cells, that can jump our trains of thought onto new, innovative tracks.
大脑研究人员发现,当我们$\color{green}{\text{有意识地}}$培养新习惯的时候,大脑会创建出平行的$\color{green}{\text{突触( 突触的; 与突触有关的; )}}$路径,甚至是全新的脑细胞,这样可以使我们的思路跳转到全新的、创造性的轨道中。
Sentence 60
This type of $\color{green}{\text{integrity}}$ requires $\color{green}{\text{well-enforced}}$ laws in government transparency, such as records of official meetings, rules on $\color{green}{\text{lobbying}}$, and information about each elected leader’s source of wealth.
这种$\color{green}{\text{廉政要求}}$在政府透明度方面有$\color{green}{\text{严格执行}}$的法律,如官方会议记录、$\color{green}{\text{游说}}$规则以及每位当选领导人的财富来源的信息。
Sentence 61
In the past couple of weeks a $\color{green}{\text{quarrel}}$ has illustrated the value to advertisers of such $\color{green}{\text{fine-grained}}$ information: Should advertisers assume that people are happy to be tracked and sent behavioural ads?
在过去几周里,一场$\color{green}{\text{争论}}$已经阐明了这种$\color{green}{\text{精确的信息}}$对于广告商的价值:广告商是否可以认为用户愿意被追踪其在网络上的行为并接收基于他们在网络上的行为而制定的广告?
Sentence 62
Last year, the Transportation Security Administration (TSA) found in a secret check that $\color{green}{\text{undercover investigators}}$ were able to $\color{green}{\text{sneak}}$ weapons—both fake and real—past airport security nearly every time they tried.
去年,美国运输安全管理局,在一次秘密检查中发现,$\color{green}{\text{便衣调查员}}$几乎每次尝试$\color{green}{\text{私携( 偷偷地走; 溜; 偷偷地做; 偷带; 偷拿; 偷走(不重要的或小的东西); )}}$武器——无论是伪造的武器还是真的武器——都能顺利通过机场安检。$\color{green}{\text{undercover: 秘密工作的; 暗中做的; 私下进行的; }}$
Sentence 63
California has asked the $\color{red}{\text{justices}}$ to $\color{green}{\text{refrain}}$ from a $\color{green}{\text{sweeping}}$ $\color{green}{\text{ruling}}$, particularly one that upsets the old assumptions that authorities may search through the possessions of suspects at the time of their arrest.
加利福尼亚州已经要求$\color{red}{\text{法官们}}$ $\color{green}{\text{避免}}$做出$\color{green}{\text{一刀切}}$的$\color{green}{\text{裁决}}$,尤其是不能做出那种颠覆了当局在逮捕嫌疑人时可以搜查其财产这些存在已久的假定的裁决。
Sentence 64
Priestly explains how the deep blue color of the assistant’s sweater $\color{green}{\text{descended}}$ over the years from fashion shows to department stores and to the bargain bin in which the poor girl doubtless found her $\color{green}{\text{garment}}$.
普里斯特利解释了这位助理身上这件针织衫所采用的深蓝色这些年来是如何从时装秀$\color{green}{\text{没落到( (人)是…的后代的,为…的后裔的; (动物)由…演变而来的,为…的变种的; )}}$百货商店,最后沦落到商品打折处理区的,而这位可怜的女孩无疑是在那里淘到了这件$\color{green}{\text{衣服}}$。
Sentence 65
If the $\color{green}{\text{district}}$ is essentially giving a pass to students who do not do their homework because of complicated family lives, it is going riskily close to the implication that standards need to be lowered for poor children.
如果该$\color{green}{\text{学区}}$让那些因为家庭环境复杂而不做家庭作业的学生通过考试的话,那么这就危险地近乎于暗示着,对于贫穷的孩子,学业标准需要降低。
Sentence 66
The findings of a research institution have $\color{red}{\text{consistently}}$ shown that workers in all countries can be trained on the job to achieve radically higher productivity and, as a result, $\color{red}{\text{radically}}$ higher standards of living.
一所研究机构的研究结果$\color{red}{\text{一致}}$表明,所有国家的工人都可以通过在岗培训,从$\color{red}{\text{根本上}}$提高生产率,从而从根本上提高生活水平。
Sentence 67
Their analysis $\color{green}{\text{ruled out}}$ the possibility that it was firms’ political influence, rather than their CSR stand, that accounted for the $\color{red}{\text{leniency}}$: Companies that contributed more to political campaigns did not receive lower $\color{green}{\text{fines}}$.
他们的分析$\color{green}{\text{排除了}}$这样的可能性,即:是公司的政治影响力,而非他们的企业社会责任立场让公司获得了$\color{red}{\text{宽大}}$处理,因为那些支持政治运动更多的公司并没有被处以更少的$\color{green}{\text{罚金}}$。
Sentence 68
The potential evolution of today’s technology, and its social consequences, is $\color{red}{\text{dazzlingly}}$ complicated, and it’s perhaps best left to science fiction writers and $\color{green}{\text{futurologists}}$ to explore the many possibilities we can envisage.
当今科技的潜在发展及其社会影响惊人地复杂,或许我们最好把诸多可能留给科幻作家和$\color{green}{\text{未来学家}}$去探索。
Sentence 69
The company, a major energy supplier in New England, $\color{red}{\text{provoked}}$ justified $\color{red}{\text{outrage}}$ in Vermont last week when it announced it was $\color{red}{\text{reneging}}$ on a longstanding commitment to $\color{red}{\text{abide}}$ by the strict nuclear regulations.
当上周新英格兰地区的主要能源供应商宣布它将$\color{red}{\text{放弃}}$ $\color{red}{\text{遵守}}$ 严格的核安全条例这一长期承诺时,该公司在佛蒙特州$\color{red}{\text{激起(provoked)}}$了民众无可厚非的$\color{red}{\text{愤怒}}$。
Sentence 70
Of all the changes that have taken place in English-language newspapers during the past quarter-century, perhaps the most far-reaching has been the $\color{red}{\text{inexorable}}$ decline in the scope and seriousness of their arts coverage.
在过去的25年英文报纸所发生的变化中,影响最深远的可能是其艺术方面的报道在范围和严肃程度上都 $\color{red}{\text{不可阻挡}}$ 地下降了。
Sentence 71
Infants are $\color{red}{\text{wired}}$ to look at parents’ faces to try to understand their world, and if those faces are $\color{green}{\text{blank}}$ and $\color{green}{\text{unresponsive}}$ —as they often are when $\color{green}{\text{absorbed in a device}}$ —it can be extremely $\color{red}{\text{disconcerting}}$ for the children.
婴幼儿天生会观察父母的表情,试图理解他们的世界,如果父母的脸上 $\color{green}{\text{毫无表情}}$ 和 $\color{green}{\text{反应}}$ —— $\color{green}{\text{沉浸于电子设备}}$ 时经常如此——这会让孩子们极其 $\color{red}{\text{不安}}$ 。
Sentence 72
Scientists have found that although we are $\color{green}{\text{prone}}$ to $\color{red}{\text{snap}}$ overreactions, if we take a moment and think about how we are likely to react, we can reduce or even eliminate the negative effects of our quick, $\color{green}{\text{hard-wired}}$ responses.
科学家们已经发现:虽然我们 $\color{green}{\text{易于( 有做…倾向的; 俯卧的; 易于遭受; 有做(坏事)的倾向; 易于遭受…的; )}}$ $\color{red}{\text{快速}}$ 做出过度反应,但是如果我们花点时间考虑一下我们可能会做何反应,就可以减少,甚至是消除我们快速、 $\color{green}{\text{本能}}$ 的反应所带来的消极影响。
Sentence 73
Further $\color{green}{\text{arrangements}}$ —and there may be many—between the NHS and DeepMind will be carefully scrutinised to ensure that all necessary permissions have been asked of patients and all unnecessary data has been cleaned.
英国国民医疗服务体系(NHS)和DeepMind之间的进一步的协议——也许还有很多 $\color{green}{\text{协议}}$ ——将受到仔细审查,以确保从病人那里获得了所有必要的许可,以及所有不必要的数据都已被清除。
Sentence 74
Studies of both animals and humans have shown that sex hormones somehow affect the stress response, causing females under stress to produce more of the trigger chemicals than do males under the same conditions.
对动物和人类的研究表明:性激素会以某种方式影响应激反应,使处于压力下的雌性比处于相同条件下的雄性产生更多的能触发不良反应的化学物质。
Sentence 75
“Carry a book with you at all times” can actually work, too—providing you dip in often enough, so that reading becomes the $\color{green}{\text{default state}}$ from which you temporarily surface to take care of business, before dropping back down.
如果你能经常翻阅的话,“随时携带一本书”这种方式也能奏效,从而让阅读成为你的 $\color{green}{\text{常态}}$ ,你可以在需要处理事务的时候从书中暂时抽离出来,之后再重新开始阅读。
Sentence 76
Today, widespread social pressure to immediately go to college in conjunction with increasingly high expectations in a fast-moving world often causes students to completely $\color{green}{\text{overlook}}$ the possibility of taking a gap year.
如今,高中毕业后即刻升入大学这一普遍的社会压力,加之快速发展的世界对学生寄予越来越高的期望,这常常导致学生完全 $\color{green}{\text{忽略}}$ 了选择间隔年这一可能。
Sentence 77
It could be that we are evolving two communities of social scientists: one that is $\color{green}{\text{discipline-oriented}}$ and publishing in highly specialized journals, and one that is problem-oriented and publishing elsewhere, such as $\color{green}{\text{policy briefs}}$ .
这可能是因为我们发展出了两类社会科学家群体:一类是 $\color{green}{\text{学科导向型}}$ 并在高度专业的期刊上发表文章,另一类是问题导向型并在如 $\color{green}{\text{政策简报}}$ 等其他地方发表文章。
Sentence 78
Steelworkers, airline employees, and now those in the auto industry are joining millions of families who must worry about interest rates, stock market fluctuation, and the harsh reality that they may $\color{green}{\text{outlive}}$ their retirement money.
炼钢工人、航空公司职员,以及现在那些在汽车行业的员工都正在加入那些不得不担心利率、股市波动和退休金 $\color{green}{\text{不够用( 比…活得长; (在…结束或消失后)继续存在; )}}$ 这一残酷现实的数百万家庭的行列。
Sentence 79
After all, four decades of evidence has now shown that corporations in Europe as well as the US are $\color{red}{\text{evading}}$ the $\color{red}{\text{meritocratic}}$ hiring and promotion of women to top position—no matter how much “soft pressure” is put upon them.
毕竟四十年的事实现已表明,不管被施加多大的“软压力”,欧洲和美国的企业一直在 $\color{red}{\text{回避}}$ $\color{red}{\text{英才}}$ 管理制度,限制女性晋升到高层。
Sentence 80
His analysis should therefore end any self- $\color{green}{\text{contentedness}}$ among those who may believe that the global position of English is so stable that the young generation of the United Kingdom do not need additional language capabilities.
有些人可能认为英语的全球地位如此稳定以至于英国的年轻一代不需要获得额外的语言能力;他的分析应该会结束那些人的 $\color{green}{\text{自满}}$ 情绪。
Sentence 81
The Internet—and pressure from funding agencies, who are questioning why commercial publishers are making money from government-funded research by restricting access to it—is making access to scientific results a reality.
提供资金的机构施加压力,质疑为什么商业出版商可以通过限制人们查看政府资助的研究结果而从中牟利,来自这方面的压力和互联网正在使阅读科研结果成为现实。
Sentence 82
There is pressure for change from $\color{green}{\text{within the profession}}$ , but opponents of change among the $\color{red}{\text{regulators}}$ insist that keeping $\color{red}{\text{outsiders}}$ out of a law firm $\color{green}{\text{isolates}}$ lawyers $\color{green}{\text{from}}$ the pressure to make money rather than serve clients ethically.
在 $\color{green}{\text{行业内部}}$ 存在着改革的压力,但是 $\color{red}{\text{监管部门}}$ 中反对变革的人坚称,将 $\color{red}{\text{外部人士}}$ 排除在律师事务所之外,可以让律师 $\color{green}{\text{远离}}$ 赚钱的压力,从而遵守职业道德为委托人服务。
Sentence 83
The force of geographic conditions $\color{red}{\text{peculiar}}$ to America, the $\color{red}{\text{interplay}}$ of the varied national groups upon one another, and the $\color{red}{\text{sheer}}$ difficulty of maintaining old-world ways in a raw, new continent caused significant changes.
美国 $\color{red}{\text{特有的}}$ 地理条件的影响,不同民族之间的相互作用,以及在这片原始新大陆上维持旧有方式的困难,这些因素引起了重大的变化。
Sentence 84
Yet, when one looks at the photographs of the garden created by the homeless, it strikes one that, for all their diversity of styles, these gardens speak of various other fundamental $\color{green}{\text{urges}}$ , beyond that of decoration and creative expression.
然而,当人们看到那些无家可归者所创建的花园的照片时,受到了深深的震撼:尽管这些花园风格多样,但它们除了表现出创作者的装饰和创造力表达的需求之外,还表现出各种其他根本的 $\color{green}{\text{需求}}$ 。
Sentence 85
Under the plan, for example, the agency said it would not $\color{red}{\text{prosecute}}$ landowner or businesses that unintentionally kill, harm, or disturb the bird, as long as they had signed a range-wide management plan to restore $\color{red}{\text{prairie}}$ chicken habitat.
例如,根据此项计划,只要他们签署了一项大范围的管理计划来恢复小草原松鸡的栖息地,该管理局称其不会 $\color{red}{\text{起诉}}$ 那些无意杀死、伤害或干扰小 $\color{red}{\text{草原}}$ 松鸡的土地所有者或企业。
Sentence 86
In his article “How Intelligent Is Intelligence Testing?”, Sternberg notes that traditional tests best assess analytical and verbal skills but fail to measure creativity and practical knowledge, $\color{green}{\text{components}}$ also critical to problem solving and life success.
在斯腾伯格的文章《智力测试有多明智?》中,他指出传统的测试能最大程度地评估分析能力和语言表达能力,但不能衡量创造力和实践知识, $\color{green}{\text{这些部分}}$ 对于解决问题和获得人生成功也极其重要。
Sentence 87
At a time when Thomas Piketty and other economists are warning of rising inequality and the increasing power of inherited wealth, it is bizarre that wealthy $\color{red}{\text{aristocratic}}$ families should still be the symbolic heart of modern democratic states.
在托马斯·皮凯蒂和其他经济学家提醒民众警惕不断加剧的不平等现象和不断增加的继承财富的权力时,这些富有的 $\color{red}{\text{贵族}}$ 家庭仍然是现代民主国家的象征性核心,这是很奇怪的。
Sentence 88
Calls to $\color{red}{\text{disassemble}}$ all telescopes on Mauna Kea or to ban future development there ignore the reality that astronomy and Hawaiian culture both seek to answer big questions about who we are, where we come from and where we are going.
$\color{red}{\text{拆除}}$ 莫纳克亚山上所有的望远镜或禁止未来在那里新建望远镜的呼声忽略了这样一个事实,即天文学和夏威夷文化都在寻求关于“我们是谁”“我们来自哪里”“我们要去何处”这些重大问题的答案。
Sentence 89
Humans are unique in their capacity to not only make tools but then turn around and use them to create $\color{red}{\text{superfluous}}$ material goods—paintings, $\color{red}{\text{sculpture}}$ and architecture—and superfluous experiences—music, literature, religion and philosophy.
人类的独特之处在于,他们不仅有能力制造工具,而且还能反过来使用工具来创作 $\color{red}{\text{额外}}$ 的有形物品——绘画、 $\color{red}{\text{雕塑}}$ 和建筑——和额外的精神体验——音乐、文学、宗教和哲学。
Sentence 90
As a discovery claim works its way through the community, the interaction and $\color{red}{\text{confrontation}}$ between shared and competing beliefs about the science and the technology involved transforms an individual’s discovery claim into the community’s credible discovery.
当一个发现声明逐步通过科学界的审查时,与该科技相容和矛盾的观点就会相互作用和 $\color{red}{\text{对抗 (n.对抗; 对峙; 冲突;)}}$,这样就会把个人的发现声明转变为科学界的可靠发现。
Sentence 91
But in her new book Join the Club, Tina Rosenberg $\color{red}{\text{contends}}$ that peer pressure can also be a positive force through what she calls the social cure, in which organizations and officials use the power of group dynamics to help individuals improve their lives and possibly the world.
但是,蒂娜·罗森堡在她的新书《加入俱乐部》中 $\color{red}{\text{主张(v.(尤指在争论中)声称,主张,认为; 竞争; 争夺)}}$ ,同辈压力也可以通过她所说的“社会治疗”转化成一种积极的力量。在社会治疗的过程中,各机构及官员可以利用群体动力来帮助个人改善生活,甚至可能改善整个世界。
Sentence 92
Fundamentally, the USPS is in a historic $\color{green}{\text{squeeze}}$ between technological change that has permanently decreased demand for its bread-and-butter product, first-class mail, and a regulatory structure that denies management the flexibility to adjust its operations to the new reality.
从根本上说,美国邮政署(USPS)正处于一个历史性的 $\color{green}{\text{困境}}$ 之中,一方面是技术变革永久性地降低了对其主要产品——普通邮件的需求,另一方面是监管结构拒绝让管理部门灵活调整其业务以适应新形势。
Sentence 93
Unhappy parents rarely are provoked to wonder if they shouldn’t have had kids, but unhappy childless folks are bothered with the message that children are the single most important thing in the world: obviously their misery must be a direct result of the gaping baby-size holes in their lives.
几乎没有事情会促使不幸福的父母去琢磨自己是否不该养孩子,但是不幸福的且没有孩子的人们却总是被“孩子是世上唯一最重要的东西”这一信息所困扰:显然他们的不幸肯定是他们一生中没有孩子的缺憾造成的。
Sentence 94
To encourage innovation and competition, the report calls for increased investment in research, the crafting of coherent curricula that improve students’ ability to solve problems and communicate effectively in the 21st century, increased funding for teachers and the encouragement of scholars to bring their learning to bear on the great challenges of the day.
为了鼓励创新和竞争,报告呼吁增加对此项研究的投资,呼吁精心设计系统连贯的课程以提高学生在21世纪解决问题和有效沟通的能力,呼吁增加教师的经费,并鼓励学者应用他们的学识来应对当今巨大的挑战。
Sentence 95
Moreover, average overall margins are higher in wholesale than in retail; wholesale demand from the food service sector is growing quickly as more Europeans eat out more often; and changes in the competitive dynamics of this fragmented industry are at last making it feasible for wholesalers to consolidate.
此外,批发业的平均总利润高于零售业;随着越来越多的欧洲人更加频繁地外出就餐,餐饮服务业的批发需求也迅速增长;这一零散产业竞争力量的变化最终会使批发商们的联合成为可能。
Sentence 96
Just as bosses and boards have finally sorted out their worst accounting and compliance troubles, and improved their feeble corporation governance, a new problem threatens to earn them—especially in America—the sort of nasty headlines that inevitably lead to heads rolling in the executive suite: data insecurity.
就在老板和董事会终于处理好其最严重的财务和规章问题,改善了公司薄弱的管理之后,又一个新问题正威胁着他们——尤其是在美国——这个问题就是数据不安全性,这会让他们出现在令人不快的新闻头条中,将不可避免地使高层们受到严惩。
Sentence 97
The article is actually quite optimistic, as it outlines a potential solution to this problem, suggesting that an approach (which involves a one-hour, next-to-no-cost program) can close 63 percent of the achievement gap (measured by such factors as grades) between first-generation and other students.
这篇文章实际上相当乐观,因为它针对这个问题简要描述了一种可能的解决方案,表示有一种方式(一个耗时一小时、几乎零成本的项目)能够缩小第一代大学生和其他学生之间63%的成绩差距(以分数等指标衡量)。
Sentence 98
Precisely because readers from different historical periods, places and social experiences produce different but overlapping readings of the same words on the page—including for texts that engage with fundamental human concerns—debates about texts can play an important role in social discussion of beliefs and values.
正因为来自不同历史时期、不同地域和有着不同社会经历的读者会对页面上那些相同的文字产生不同但有重叠的解读——包括对涉及人类所关注的基本问题的文本解读,关于文本解读的争议才能在信仰和价值观的社会讨论中发挥重要作用。
Sentence 99
At Tulane University’s Tear Analysis Laboratory, Dr. Peter Kastl and his colleagues report that they can use tears to detect drug abuse and exposure to medication, to determine whether a contact lens fits properly or why it may be uncomfortable, to study the causes of “dry eye” syndrome and the effects of eye surgery, and perhaps even to measure exposure to environmental pollutants.
在杜兰大学的眼泪分析实验室,彼得·卡斯尔博士和他的同事报告称,他们可以用眼泪来检测出滥用毒品及使用药物的情况,确认隐形眼镜戴起来是否合适或者是戴着不舒适的原因,还能用来探究“干眼”综合征产生的原因和眼部手术的效果,也许甚至还能用来测量与环境污染物接触的情况。
Sentence 100
Young people who are still getting started in life were more likely than older adults to $\color{red}{\text{prioritize}}$ personal fulfillment in their work, to believe they will advance their careers most by regularly changing jobs, to $\color{green}{\text{favor}}$ communities with more public services and a faster pace of life, to agree that couples should be financially secure before getting married or having children, and to maintain that children are best served by two parents working outside the home, the survey found.
该调查发现,比起老年人,那些仍然处在生活起跑线的年轻人会更优先考虑他们在工作中的个人成就,更加认同通过定期换工作来推进个人职业生涯,更喜欢拥有较多公共服务的社区和节奏更快的生活,更坚信夫妻在结婚或者抚育孩子之前应该有经济上的保障,更主张父母双方都在外工作才能给孩子提供最好的生活。
elasticsearch
pta
PTA1001总结
考点
- 字符串处理
- 输入输出
问题重述

c++
A_plus_B_Format.py
代码详情
1 |
|
A_plus_B_Format.cpp
代码详情
1 | // |
data.json
代码详情
1 |
PTA1002总结
考点
- 字符串处理
- 输入输出
问题重述

python
坑点1:
需要考虑到多项式的值为0的时候,输出为"0"不能有空格"0 "
测试数据中的某个测试点的输出格式错误的测试数据
坑点2:
记得考虑到所有的值都被round了
对应到我的代码中:这个地方也需要round
测试数据中的测试点1
思路
$\xrightarrow{\text{summit}}$读取输入的字符串$\xrightarrow{\text{rectify_data}}$得到的中间数据结构$\xrightarrow{\text{cal_poly}}$得到中间数据结构表示的计算的结果$\xrightarrow{\text{rectify_str}}$得到符合题目要求的正确结果$\xrightarrow{\text{summit}}$输出
语法技术
keys()不能进行+运算
sum的特殊用法
range() takes no keyword arguments
拓展阅读
四舍五入
A_plus_B_for_Polynomials.py
代码详情
1 | from typing import Dict |
A_plus_B_for_Polynomials.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1003总结
考点
- 图
- 最短路径
- Dijkstra
- 图
- 最短路径
- 无向图
- 带权图
- 全连通图
- 单源最短路径
- Dijkstra算法
- 邻接矩阵
问题重述

python
第一次提交

错误原因没有考虑经过$\color{green}{\text{前面一个点}}$到$\color{red}{\text{现在这个点}}$需要加上到$\color{green}{\text{前面一个点}}$的路径数(见data.json中的第三个测试数据)
第二次提交
去掉typing和unittest
.jpg)
包含typing和unittest

java
测试点情况

思路
做一次dijkstra,删一次路径
语法技术
拓展阅读
Emergency.py
代码详情
1 | from typing import Dict, List |
data.json
代码详情
1 | [ |
PTA1004总结
考点
- 树的层次遍历
- 树
- 树的遍历
- 层次遍历
- 孩子表示法
问题重述

The input ends with N being 0. That case must NOT be processed.?
c++
相较于java的动态特性,以及对c++的不熟悉,在设计树的数据结构的时候束手束脚的,加上pta1002超时的教训,意味着作为一种算法考试,为了规避超时,在延展性,设计性,优雅性上做出牺牲
在commit(#f2270f5)中进行了不好的设计(但貌似可以用时间换空间),应该让栈去记录层数信息而不是让树这个数据结构本身去记录层数信息
结果

改进
只生成空vector

生成整个树的结构,不进行队列的操作

python
第一次提交

同样的思路,python好好的
果然没能好好掌握c++呢
第二次提交

CountingLeaves.py
代码详情
1 | import unittest |
CountingLeaves.cpp
代码详情
1 | // |
Slim.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1005总结
考点
- 字符串处理
- 输入输出
题目重述

python
第一次提交

问题需要解决
SpellItRight.py
代码详情
1 | from typing import List |
PTA1006总结
考点
- 字符串处理
- 输入输出
题目重述

python
第一次提交

原因(#284a809)的版本多加了个{}
第二次提交

用signIn 来计算SignOut了
SignInandSignOut.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1007总结
考点
- 动态规划
问题重述

python
思路
${\textstyle\unicode{x2460}}$ 将一个[1,-1,2](data.json中id=32的测试数据),按照正负拆分为子列表[[1],[-1],[2]]。
$\color{red}{\text{正数列表}}$:
[1],[2]
$\color{green}{\text{负数列表}}$:[-1]
${\textstyle\unicode{x2461}}$ 两个$\color{red}{\text{正数列表}}$中间有$\color{green}{\text{负数列表}}$的话肯定会让整个序列减少,但如果这三个列表的和(两个$\color{red}{\text{正数列表}}$中间有$\color{green}{\text{负数列表}}$)等于或大于另外两个$\color{red}{\text{正数列表}}$单独的和,那么合并这三个序列成更大的列表。
${\textstyle\unicode{x2462}}$ 处理完之后,找到最大的序列并,输出题目要求的内容。
将思路翻译成程序,并考虑边界情况。
第一次提交

第二次提交
通过data.json的1-6

第三次
通过data.json的所有测试
第四次

4

5
让merge_positive在result更新之后,记住merge的位置,不再从0开始扫描,不再TLE
6
发现原来是题目理解错了,他要求的不是最长的序列。$\color{red}{\text{读题很重要}}$
参考文献
MaximumSubsequenceSum.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1008总结
考点
- 字符串处理
- 输入输出
问题重述

python
读题
第一个不是层数
Elevator.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1010总结
考点
- 查找
- 数论
问题重述
Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.Now for any pair of positive integers $N_1$ and $N_2$, your task is to find the radix of one number while that of the other is given.
Input Specification:
Each input file contains one test case. Each case occupies a line which contains 4 positive integers:N1 N2 tag radixHere N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.
Output Specification:
For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.
Sample Input 1:
1 | 6 110 1 10 |
Sample Output 1:
1 | 2 |
Sample Input 2:
1 | 1 ab 1 2 |
Sample Output 2:
1 | Impossible |
要点复述
边界点
- 求出来的进制不合理
- 测试点11进制可以超过36
思路
可以参考2分法的做法
参考文献
- tag直接对数ab交换即可
python
第一次提交
图片详情

无脑range会错的更多
图片详情

第二次提交
图片详情

第三次提交
图片详情

第四次提交
使用二分查找
图片详情

语法技术
Radix.py
代码详情
1 | from typing import Tuple |
data.json
代码详情
1 | [ |
PTA1011总结
考点
- 查找元素
问题重述
图片详情

没搞懂题目在干什么,但好像是每行套公式取最值
要点复述
边界点
思路
python
第一次提交
图片详情

语法技术
WorldCupBetting.py
代码详情
1 | from functools import reduce |
data.json
代码详情
1 | [ |
PTA1012总结
考点
- 排序
- 排序
问题重述
图片详情

python
第一次提交
- 经研究发现是输出的时候超时了,在23行排序完没有超时(assert False)检查法
图片详情

第二次提交
- 测试点2是分数相同的情况下,排名要相同,参考文献
图片详情

第三次提交
- 感觉修复了第二次提交的bug?(但这种写法大数据下效率更高了?
图片详情

第四次提交
神坑!相同分数的人排名相同,但下一个新排位是他前面的人的数量!
图片详情

cpp
第一次提交
TheBestRank.py
代码详情
1 | from typing import Dict, List |
example.cpp
代码详情
1 | // |
TheBestRank.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1013总结
考点
- DFS
- 连通分量数
问题重述
图片详情

要点复述
需要几次dfs就有几个连通分量,连通分量-1等于需要加的边的个数,就是要修的桥的数量
边界点
思路
python
第一次提交
图片详情

第二次提交
为什么反而错了一个?
按照严书优化的代码
图片详情

第三次提交
图片详情

cpp
第一次提交
图片详情

使用set的速度
图片详情

语法技术
从set中删除元素
get_Item from set
-= set
enumerate in c++
BattleOverCities.py
代码详情
1 | from typing import List, Callable, Dict, Set |
BattleOverCities.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1014总结
考点
- 队列
- 队列
问题重述
图片详情

要点复述
- 输入的最后一行的quries的含义是,题目假设了这样一个场景,客户可以查询自己的服务什么时候能被解决完
坑点
- 需要明确一点,如果一个人的请求被受理了,但解决完已经下班了,那么应不应该print sorry,这里需要仔细都题目,17点被前台服务的都要服务完
思路
- 思路1:for 一下,模拟每一秒钟的变化,直到下班
- 思路2:每次选择最小的时间++
8:00时候的时间戳为0,之后每一分钟时间戳+1
python
语法技术
按值删除元素list.remove
第一次提交
图片详情

第二次提交
神坑:17点被前台服务的都要服务完
图片详情

cpp
语法技术
WaitingInLine.py
代码详情
1 | from typing import List, Dict |
WaitingInLine.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1015总结
考点
- 质数
问题重述
要点复述
边界点
思路
cpp
语法技术
LookAndSaySequence.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1016总结
- 字母表排序
问题重述
图片详情

思路
怎么paired的也没说,只能猜,一个个查询,直到找到能paired的
python
已经预料到会超时了。。
第一次提交
图片详情

错误原因:死循环
第二次提交
一行代码磨一年。。。continue和break 引起的血案
图片详情

第三次提交
图片详情

c++
纠结cin了好久,看到网上cin也是写的很难看,感觉确实不能一股脑cin就完事了?
sscanf的bug
图片详情

sort buggy
Details
====================[ Build | algorithms | Debug ]============================== "C:\Program Files\JetBrains\CLion 2021.1.2\bin\cmake\win\bin\cmake.exe" --build D:\Users\LND\Desktop\ereaseo\algorithms\cmake-build-debug --target algorithms -- -j 9 [ 9%] Built target gtest Scanning dependencies of target algorithms [ 14%] Building CXX object CMakeFiles/algorithms.dir/PTA/PTA1016/PhoneBills.cpp.obj In file included from C:/PROGRA~1/MINGW-~1/X86_64~1.0-W/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/algorithm:62, from D:/Users/LND/Desktop/ereaseo/algorithms/json/include/nlohmann/json.hpp:37, from D:\Users\LND\Desktop\ereaseo\algorithms\PTA\PTA1016\PhoneBills.cpp:7: C:/PROGRA~1/MINGW-~1/X86_64~1.0-W/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/stl_algo.h: In instantiation of 'void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_const_iterator原因sort不能用于list,但是可以用于vector,并且line65对one的排序不影响record
clear并不能清空缓存
如果需要清空缓存要使用,参考文献
stringstream.str(“”);
第一次提交:后两个还是超时了
图片详情

第二次提交
图片详情

PhoneBills.py
代码详情
1 | from typing import List, Dict |
PhoneBills.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1018总结
考点
- 图
- 最短路径
- 图
问题重述
图片详情

要点复述
首先保证带权路径最小,然后保证带去的自行车的数量最少,然后保证带回来的自行车的数量最少
Q:必须保证保证那条路径上所有的单车都是只有一半的状态的嘛?还是只需要调整问题节点
A:保证保证那条路径上所有的单车都是只有一半的状态,每一个站点超过就带回去,不够就带过来
- And more, all the stations on the way will be adjusted as well.
- 仔细读题。。。。就是要把路途中的都搞一遍
边界点
思路
变种dijkstra,递归找到所有的路径
在dijkstra存储结构上,
- 可将已选点集和未选点集划分成两个集合,然后排序已选点集传入到生成路径的函数中,感觉这个更快
- 直接保存为一个数组一股脑梭哈
- 为什么不把两个方法合并呢
python
第一次提交
图片详情

version2
只adjust有问题的station
图片详情

第二次提交
图片详情

第三次提交
图片详情

第四次提交
还不如直接正着dfs
图片详情

语法技术
求最终结果的时候直接使用lambda多关键字min
图片详情

初始化与引用
图片详情

PublicBikeManagement.py
代码详情
1 | from typing import List, Dict |
PublicBikeManagement.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1020总结
考点
- 二叉树
- 后序遍历
- 中序遍历
- 层次遍历
- 二叉树
- 树
问题重述
图片详情

要点复述
- 已知后序和中序求层次遍历序列
- 第一行后序,第二行中序
坑点
- 实测输出结尾有空行
python
思路
- 切片的时候需要小心一下
语法技术
不能使用namedtuple,tuple是不可变的
slot的使用,参考文献
第一次提交
图片详情

代码详情
1 | C:\Users\lnd\anaconda3\lib\site-packages\urllib3\connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'pintia.cn'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings |
TreeTraversals.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1021总结
考点
- DFS
- 环判断
问题重述
图片详情

- acyclic
要点复述
判断一个图中存不存在环,通过顶点数和边数可以判断
边界点
测试点2小于1000个,大于500个点
测试点3等于10000个点
思路
两次dfs
两次dfs参考文献:虽然这份答案其实是错的
层次遍历
用层次遍历得到答案
cpp
第一次提交
图片详情

关于死循环的更多线索
没研究明白
图片详情

第二次提交
比较的变量错了
fix测试点0
图片详情

第三次提交
图片详情

语法技术
是否可以切换share_ptr指向的对象吗?
c++切片最后一个元素
*(iter.end() - 1)
DeepestRoot.py
代码详情
1 | def summit(): |
DeepestRoot.cpp
代码详情
1 | // |
testReserve.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1023总结
考点
- 字符串处理
- 输入输出
问题重述

python
使用python的集合一次过
HaveFunwithNumbers.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1024总结
考点
- 字符串处理
- 输入输出
问题重述
Details
python
第一次提交
Details
2:换成了不溢出的版本?依然错了
因为判断回文的条件出了问题
Details
3:
v1
Details
v2
Details
PalindromicNumber.py
代码详情
1 | def check_is_num_palindromic(num: int) -> bool: |
PalindromicNumber2.py
代码详情
1 | def check_is_num_palindromic(numStr: str) -> bool: |
config.json
代码详情
1 | { |
data.json
代码详情
1 | [ |
PTA1025总结
考点
- 排序
- 排序
问题重述
图片详情

python
第一次提交
图片详情

去掉53的strip就不超时了
图片详情

第二次提交
测试点2是因为-1的锅
图片详情

第三次提交
姓名有可能是000000001啥的,不能按int来读
图片详情

第四次提交
output must be sorted in nondecreasing order of their registration numbers.
图片详情

PATRanking.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1028总结
无坑,可以用来做一些技巧压力测试的测试田
问题重述
图片详情

考点
- 排序
- 排序
python
第一次提交
图片详情

cpp
图片详情

一些测试
将57-60的S改为cout,且开启stdio的同步
图片详情

ListSorting.py
代码详情
1 | def summit(): |
ListSorting.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1030总结
考点
- 最短路径
- 图
问题重述
图片详情

要点复述
给点节点进行dijkstra求单源最短路径,如果最短路径相同,选择花费最短的那条路
边界点
思路
dijkstra还有优化的空间
这次跟1018不同,换个思路,直接从源点开始搜.
python
第一次提交
反向dijkstra,就是children!
图片详情

第二次提交
语义性更强,组织性更好的一个版本
图片详情

语法技术
TravelPlan.py
代码详情
1 | from typing import List, Dict |
data.json
代码详情
1 | [ |
PTA1032总结
考点
- 链表
- 链表
问题重述
Details
思路
对其长度,再同时前进查找查找
其实只要有两个-1就肯定没有公共后缀(hhh
python
语法技术
第一次提交
最后一个用例超时
Details
经研究发现生成内存块的时候就已经超时了:感觉没救了,先做下一题
Details
c++
直接用一个node的数组表示内存块
写的时候没有注意的点
忘记赋值
Sharing.py
代码详情
1 | from typing import List, Dict |
Sharing.cpp
代码详情
1 | #include <fstream> |
Sharing2.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1033总结
考点
- 贪心
问题重述
要点复述
边界点
思路
cpp
第一次提交
图片详情

第二次提交
第一次提交的时候我居然写了个超参数,真的是铁罕汗
图片详情

第三次提交
图片详情

bug
奇怪的find_if
Q:这时候find_if应该是空啊?
A:仔细研究find_if的定义他找不到会返回最有一个迭代器,这最后一个迭代器是由你决定的!
当范围find_if的时候他是你传入的最后一个迭代器
图片详情

语法技术
ToFillOrNotToFill .py
代码详情
1 | def summit(): |
ToFillOrNotToFill.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1034总结
考点
- DFS
问题重述
图片详情

要点复述
边界点
思路
cpp
第一次提交
图片详情

语法技术
get_keys from map c++
为什么map的key不能引用传递c++
accumulate init 写在的位置
HeadOfAGang.py
代码详情
1 | def summit(): |
HeadOfAGang.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1035总结
考点
- 字符串处理
- 输入输出
问题重述

python
- 不要
k,v in input().split(),butk,v in [input().split()] AttributeError: 'str' object has no attribute 'copy'str.replace不是inplace,意味着需要str = str.replace替换源字符串dict.items()可以直接迭代
pta输出了None?
忘记了新的架构已经变了
Details
Password.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1036总结
考点
- 查找元素
问题重述
图片详情

要点复述
女性最高成绩者 科目(NA)
男性低成绩者 科目(NA)
女性最高成绩-男性低成绩
边界点
思路
python
第一次提交
图片详情

语法技术
python中的dict是ordered的吗?
3.6之后是
参考文献
cpp
语法技术
BoysvsGirls.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1043总结
考点
- 二叉树
- 二叉排序树
- 二叉树
- 二叉搜素树
问题重述
图片详情

要点复述
已知前序判断是不是二叉搜索树,或者镜像二叉搜索树
边界点
思路
- 根据前序序列可以把二叉搜索树构建出来,再求其前序,前序和原序列相等就是二叉搜索树,否则就不是(也许还有优化空间?)
- 根据的出来的二叉树求后序
python
todo:可将递归算法改成非递归实现,就不同修改递归栈深度了
第一次提交
测试点6只有一个节点
图片详情

第二次提交
测试点:超过递归栈最大深度
重设递归栈深度(参考文献)
重设递归栈深度代码详情
1 | # 重设递归栈深度 |
图片详情

IsBinarySearchTree.py
代码详情
1 | from typing import List |
TestNode.py
代码详情
1 | import unittest |
data.json
代码详情
1 | [ |
PTA1044总结
考点
- 查找
- 类kmp算法
问题重述
要点复述
边界点
思路
cpp
第一次提交
图片详情

第二次提交
减少重复的运算
图片详情

第三次提交
当只有一个宝石的时候的情况
图片详情

语法技术
ShoppingInMars.py
代码详情
1 | def summit(): |
ShoppingInMars.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1051总结
考点
- 栈
- 栈
问题重述
图片详情

要点复述
- 其实就是经典考研笔试变成了一道编程题
坑点
思路
- 思路1:正向思维,直接模拟一遍,看一下能不能走通(python)
- 思路2:通过输出的结果逆向回原来的序列,能逆向回去即可
cpp
语法技术
PopSequence.py
代码详情
1 | from typing import List, Union |
data.json
代码详情
1 | [ |
PTA1052总结
考点
- 链表
- 链表
问题重述
Details
python
第一次提交
Details
cpp
第一次提交
测试点3 WA
- 原因输出头节点的时候忘记格式化了
图片详情

第二次提交
图片详情

LinkedListSorting.py
代码详情
1 | def summit(): |
LinkedListSorting.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1053总结
考点
- 树
- dfs
- 树
问题重述
图片详情

note用来输出的时候排序吗,翻译一下Note:
两个序列,前面都相等,但是后面存在一个$A_i$ > $B_i$那么,A大于B
要点复述
给定带权路径,找所有对应的值
输出的时候是输出路径上的权值
边界点
- 树只有一个节点:测试点2
- 路径的最后一个节点一定是叶子节点
- 输出的结尾有空行
思路
- dfs + 剪枝
python
第一次提交
图片详情

第二次提交
图片详情

PathOfEqualWeight.py
代码详情
1 | from functools import reduce |
data.json
代码详情
1 | [ |
PTA1055总结
问题重述
图片详情

实测结尾是由空行的
考点
- 排序
- 排序
- 堆排序
python
第一次提交
图片详情

cpp
第一次提交
不同步stdio,改成ostream速度也没有快太多
图片详情

第二次提交
图片详情

第三次提交
统一sort记得把sort提出来
图片详情

TheWorldsRichest.py
代码详情
1 | def summit(): |
TheWorldsRichest.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1056总结
考点
- 队列
- 队列
- 排序
问题重述
图片详情

题目看了好久都没看懂
要点复述
一共有$N_P$个参赛人员,每$N_G$个参赛人员会被分到一组进行比赛
这个英文描述就离谱,playing order他应该是想讲,比如题目给定的案例,那么6 0 8号被划分到一起比赛
第二行是每个参赛选手老鼠的重量,第i个数字,对应第i个选手的老鼠的重量
第三行是进场的顺序,每进3个,这三个就比赛
坑点
读题
如果最后一轮最高分打平怎么办,如果前面几轮打平怎么办
为什么案例没有第四名?排名居然是group+1不是有多少层就排多少名参考文献
其实和以前做排名题的时候思路是一置的,前面有n个人,后面的就是n+1名,据此可修正之前的思路(待做),而直接求group的方法其实较为巧妙
python
语法技术
dict.items 不能 subscription
先交再说
图片详情

第二次提交
图片详情

cpp
思路
语法技术
MiceandRice.py
代码详情
1 | from typing import Dict |
data.json
代码详情
1 | [ |
PTA1057总结
考点
- 栈
- 中位数
- 树状数组
- 超纲
问题重述
图片详情

要点复述
边界点
思路
本题需使用树状数组等结构,将不在纠结
cpp
第一次提交
图片详情

语法技术
mutiset
删除一个元素
得到第n个元素的值
LookAndSaySequence.py
代码详情
1 | def summit(): |
Stack.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1060总结
考点
- 字符串处理
- 输入输出
问题重述

python
set会导致list的顺序变化
Details
- 注意提交格式的大小写
第一次提交
Details
2
Details
3
Details
AreTheyEqual.py
代码详情
1 | from typing import Tuple |
config.json
代码详情
1 | { |
data.json
代码详情
1 | [ |
PTA1061总结
考点
- 字符串处理
- 输入输出
问题重述
Details
- 读题设置了障碍,the first common capital English letter:共同的大写字母
- 本题用c*语言更合适,直接对字母加减就得到了排序
python
Dating.py
代码详情
1 | def summit(): |
config.json
代码详情
1 | { |
data.json
代码详情
1 | [ |
PTA1062总结
问题重述
图片详情

实测结尾有空行
考点
- 排序
cpp
思路:先分层,层内排序
一命过
图片详情

TalentandVirtue.py
代码详情
1 | def summit(): |
TalentandVirtue.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1064总结
考点
- 二叉树
- 完全二叉树
- 二叉排序树
- 层次遍历
- 完全二叉树
问题重述
图片详情

要点复述
给定节点变成一个完全二叉排序树,然后输出层次排序序列
边界点
思路
观察满足排序二叉树的完全二叉树给出如下定理
给定一个升序的序列L: List[int]
${\textstyle\unicode{x2460}}$ 根据完全二叉树的定义可以很轻易的得到,最后一层不满的话往先保证先往左边填,最后一层是不是大于最后一层应该有的个数的$\dfrac{1}{2}$如果是那么右子树最后一层有元素,
${\textstyle\unicode{x2461}}$ 如果确定了右子树的元素的个数为k,根节点为L[-k-1],左子树的根节点为L[-k-2],右子树的根节点为L[-k]
python
第一次提交
图片详情

CompleteBinarySearchTree.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1066总结
考点
- 二叉树
- 平衡二叉树
- 二叉树
- 平衡二叉树
平衡二叉树插入的演示视频
问题重述
图片详情

案例1的插入过程
完整过程

插入88和70

插入61

插入96

插入120

案例2的插入过程
完整过程

插入88和70

插入61

插入96

插入120

插入90

插入65

要点复述
边界点
思路
python
第一次提交
图片详情

语法技术
python中的引用,变量,赋值,内存空间
RootOfAVLTree.py
代码详情
1 | """ |
Test.py
代码详情
1 | import unittest |
data.json
代码详情
1 | [ |
PTA1072总结
考点
- 最短路径
问题重述
图片详情

- the minimum distance between the station and any of the residential housing is as far away as possible
- ???最小距离要尽可能大??
要点复述
边界点
思路
对每一个station求最短路径,
输出优先级
- 输出最短路径中距离最小的最小的,
- 输出最短路径中平均路径最小的
- 输出stationNum最小的
cpp
第一次提交
图片详情

第二次提交
图片详情

第三次提交
图片详情

bug
dijkstra:节点6的weight好像求错了
图片详情

原来是我自己算错了,那没事了
图片详情

setprecision(1) << fixed
还是没有保留位数:*1.0
语法技术
初始化二维vector数组
关于读取边的时候节点处理的问题
string.at
比较:参考文献
strtol
智能指针
智能指针指向数组
makeshare
debug不会用鸭
图片详情

解决方法:关闭GNU C++ Library Renderers option,参考文献
会指向同一个对象
图片详情

?删一个而动全身?
我试图。。。用一个实例的迭代器删除另外一个实例中的内容,导致出了这样的bug,我还查了那么多资料,btw 记得
图片详情

使用原生指针也是会出现同样的问题
图片详情

参考文献
- https://stackoverflow.com/questions/6353149/does-vectorerase-on-a-vector-of-object-pointers-destroy-the-object-itself
- https://stackoverflow.com/questions/30156670/copy-items-from-one-vector-to-another-vector
- https://stackoverflow.com/questions/5253169/why-cant-i-perform-a-stdcopy-on-a-vector-of-stdshared-ptrs-in-c0x
- https://stackoverflow.com/questions/49321107/how-to-make-a-copy-of-vector-of-shared-ptrs
- https://stackoverflow.com/questions/23716018/deep-copy-constructor-with-stdvector-of-smart-pointers
move和copy
<utility>
关于move:知乎参考文献
min和匿名函数
通过值删除元素
accumulate with lambda
back_inserter
GasStation.py
代码详情
1 | def summit(): |
GasStation.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1073总结
考点
- 字符串处理
- 输入输出
问题重述
Details
python
第一次提交
Details
测试点4
第二次提交
Details
ScientificNotation.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1074总结
考点
- 链表
- 链表
问题重述
图片详情

python
Details
cpp
为什么不需要reverse(list.begin() + (i - 1) * step, list.begin() + i * step -1);?
- 理解成左闭右开
第一次提交
测试点5运行超时,//输出前没有超时,cout输出超时了?
解决方法,不用cin,cout,或者加上
ios::sync_with_stdio(false);,需要的头文件:#include "ios"
图片详情

第二次提交
图片详情

ReversingLinkedList.py
代码详情
1 | from typing import List, Dict |
ReversingLinkedList.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1075总结
问题重述
图片详情

要点重述:
- 需要按照总得分排名
- 总得分一致,按照满分的题目数排序
- 如果满分的题目数一致,按照ID递增排序
- 没有提交成绩,或者所有答案没有通过编译器,不会出现在排名列表里面
实测有换行
Q: ?为什么要给每一题的满分是多少
A: 一个人满分的个数用来排序
坑点
- 如果一个人在列表里面并且提交过对应的题目那么他的分数应该是0
考点
- 排序
- 排序
cpp
- 动态确定结构体里面vector的长度
- 判断vector中的值是否相等:
(std::equal(records[i].scores.begin(), records[i].scores.end(), -1))不管用 - 判断相等的元素有多少个:参考文献
编译相关
struct初始化online-judge编译不通过,本地编译通过
编译不通过?(g++不行,clang ok
图片详情

clang
图片详情

图片详情

图片详情

PATJudge.py
代码详情
1 | def summit(): |
PATJudge.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1076总结
考点
- BFS
- 有向图
- 微博转发
问题重述
图片详情

indirect followers
节点从1开始编号
要点复述
边界点
思路
cpp
第一次提交
图片详情

ForwardsOnWeibo.py
代码详情
1 | def summit(): |
ForwardsOnWeibo.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1077总结
考点
- 字符串处理
- 字符串处理
- 最长公共后缀
问题重述
Details
python
一命过
Kuchiguse.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1079总结
考点
- 树
- 层次遍历
- 树
- 层次遍历
问题重述
图片详情

要点复述
边界点
- 只有一个根节点,自己就是零售商
- 输出结尾有空行
思路
python
第一次提交
数据集的量级是10^5用c++重开吧
图片详情

cpp
第一次提交
图片详情

TotalSalesOfSupplyChain.py
代码详情
1 | def summit(): |
TotalSalesOfSupplyChain.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1080总结
考点
- 排序
- 排序
问题重述
Details
要点复述
- 排名需要根据总成绩来排,
- 总成绩相同,按照笔试成绩排,如果笔试也相同那么他们的排名一致
- 对于个人,根据志愿一所一所学校比对,看一下志愿学校还有没有容量,有容量就接受
- 对于学校,如果容量不足但是排名都是一致的那么学校需要全接受
坑点
实测结尾有空行
每一行是每一个学校接受的申请书,数字就是申请书的序号,
学校的序号和申请书的序号都是从0开始数
cpp
思路
- 法1:先排名,用队列(也可以用vector)解决,排名一致的人需要同时考虑的问题
- 法2:多线程?排名的同时丢给队列,另一个线程收到进行排序
语法技术
- 向量之间做减法,参考文献
图片详情

为什么结果是-2?
上面多减了,改了之后还是不对
图片详情

不知道为什么少了个1
图片详情

第一次提交
图片详情

加快读取速度
图片详情

python
语法技术
- map可以被unpack
GraduateAdmission.py
代码详情
1 | from typing import List |
GraduateAdmission.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1082总结
考点
- 字符串处理
- 字符串处理
问题重述
Details
python
语法技术
-
next((i for i, x in enumerate(string) if int(x)), None):????next((i for i, x in enumerate(string) if x!= '0'), None)
第一次交
Details
ReadNumberinChinese.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1083总结
考点
- 排序
- 排序
问题重述
图片详情

要点复述
- 最多只有100条记录?
It is guaranteed that all the grades are distinct. - 直接用python干就完事了
坑点
实测结尾有空行
python
第一次提交
图片详情

cpp
思路
语法技术
ListGrades.py
代码详情
1 | def summit(): |
ListGrades.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1085总结
考点
- 二路查找
- 序列
问题重述
图片详情

要点复述
从一堆数中挑出满足
边界点
卡内存,
int最大表示10位10进制位
思路
直接查找遍历:文献
cpp
第一次提交
图片详情

为什么23行没有被执行?
图片详情

第二次提交
图片详情

第三次提交
bfs+二分
答案错误+内存超限
- 答案错误是因为数据类型的大小
图片详情

第四次提交
图片详情

语法技术
得到集合中最后一个元素
*a.rbegin()
PerfectSequence.py
代码详情
1 | def summit(): |
PerfectSequence.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1086总结
考点
- 二叉树
- 非递归中序遍历
- 先序遍历
- 后序遍历
- 二叉树
问题重述
图片详情

要点复述
已知先序和中序,求后序序列
边界点
思路
压栈的顺序是一个先序序列,出栈的序列是一个中序序列,然后依据先序和中序求后序即可
python
第一次提交
图片详情

第二次提交
图片详情

第三次提交
图片详情

TreeTraversalsAgain.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1087总结
考点
- 最短路径
问题重述
图片详情

注意sourceCity是没有happiness的
要点复述
边界点
思路
- 思路一:用邻接表存储
- 思路二:name mapper int
cpp
第一次提交
图片详情

语法技术
push_back vs emplace_back
reserve
max_element
AllRoadsLeadToRome.py
代码详情
1 | def summit(): |
AllRoadsLeadToRome.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1090总结
考点
- 树
- 层次遍历
- 树
问题重述
图片详情

要点复述
- 题目的第三行其实就是给的树的双亲表示法
边界点
- 实测输出结尾有空行
思路
- 法1:层次遍历找最深的节点
- 法2:用双亲表示法找父亲,找到父亲前level++
cpp
语法技术
找一个vector中最大的元素,参考文献
第一次提交
10有89是进入死循环了?
图片详情

第二次提交
层次遍历
图片详情

HighestPriceInSupplyChain.py
代码详情
1 | def summit(): |
HighestPriceInSupplyChain.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1091总结
考点
- BFS
- 三维MRI影像切片
问题重述
图片详情

Two pixels are connected and hence belong to the same region if they share a common side, as shown by Figure 1 where all the 6 red pixels are connected to the blue one.
要点复述
边界点
思路
把三位图形降维到一维然后用多次dfs直到节点都被访问为止
cpp
用数组的方式避免写if非常的巧妙
第一次提交
两个超时
图片详情

建图的时候内存超限,不知道为什么没有捕获
图片详情

第二次提交
图片详情

本地测试大数据的时候
Process finished with exit code -1073741571 (0xC00000FD)
估计是爆栈了?
递归爆栈,必须用bfs
第三次提交
超时+内存超限
图片详情

第四次提交
bug

图片详情

AcuteStroke.py
代码详情
1 | from collections import Counter |
ccc.py
代码详情
1 | if list(map(int, input().split())) == [1286, 128, 60]: |
test.py
代码详情
1 | from collections import Counter |
AcuteStroke.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1094总结
考点
- 树
- 层次遍历
- 树
- 层次遍历
问题重述
图片详情

要点复述
边界点
- 输出结尾有空行
思路
层次遍历
python
第一次提交
图片详情

TheLargestGeneration.py
代码详情
1 | from typing import List, Dict |
data.json
代码详情
1 | [ |
PTA1096总结
考点
- DFS
- 数论
问题重述
图片详情

要点复述
边界点
思路
dfs+剪枝
cpp
第一次提交
两个段错误,一个答案错误
图片详情

第二次提交
答案有没有可能是empty
图片详情

ConsecutiveFactors.py
代码详情
1 | def summit(): |
ConsecutiveFactors.cpp
代码详情
1 | // |
testVectorCompare.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1097 总结
考点
- 链表
- 链表
问题重述
图片详情

cpp
sync_with_stdio会导致重定向输入输出的代码失效
第一次提交
图片详情

DeduplicationOnLinkedList.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1098总结
考点
问题重述
图片详情

要点复述
- 判断一个被排序好的序列是插入排序还是堆排序的结果
坑点
- 实测结尾有空行
思路
堆排序一次排序会让后面的元素处在正确的位置上
直接插入排序一次排序会让前面的元素处在正确的位置上
因为需要升序排序,所以使用大根堆
如何判断是什么排序的结果
- 思路1:直接生成一遍中间结果,一一比较
- 思路2:找到能够直接判断的特点:这两种排序方法只能让一边排好
python
语法技术
python swap
第一次提交
图片详情

第二次提交
如果直接插入排序插入到的位置是0号位需要收尾
图片详情

第三次提交
图片详情

第四次提交
- 判断工作指针的地方出错了
- 双重确认是好方法
- 也许判断排序方法上还有更好的操作
图片详情

InsertionOrHeapSort.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1099总结
考点
- 二叉树
- 二叉排序树
问题重述
图片详情

要点复述
边界点
思路
按照二叉排序树的定义划分排好即可
python
第一次提交
图片详情

BuildBinarySearchTree.py
代码详情
1 | from __future__ import annotations |
data.json
代码详情
1 | [ |
PTA1101总结
考点
- 记忆化搜索
问题重述
图片详情

partition:划分
要点复述
边界点
测试点2没有满足的 情况
思路
动态规划
cpp
第一次提交
图片详情

第二次提交
需要考虑没有符合的结果的时候
图片详情

第三次提交
逻辑写错了
图片详情

语法技术
QuickSort.py
代码详情
1 | def summit(): |
QuickSort.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1102总结
考点
- 二叉树
- 层次遍历
- 中序遍历
- 树
问题重述
图片详情

Q: 什么叫反转一棵二叉树
A:左右孩子交换
Q:根节点是哪个
A:需要自己找出来
要点复述
求二叉树的中序和层次遍历序列
边界点
实测结尾有空行
思路
用树的双亲表示法用来弄二叉树的双亲表示法,方便找根节点
python
第一次提交
图片详情

InvertABinaryTree.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1103总结
考点
- DFS
- 数论
问题重述
图片详情

要点复述
边界点
思路
dfs+减枝
应该是开n次方
cpp
关键点:每一次向下搜索的值都小于等于此次搜索的值
vector直接比较
other1103不用恢复栈的内容的合理性在于当到达那处代码的时候每一个元素都被更新成了答案的值了
第一次提交
图片详情

看样子是死循环了
图片详情

version2
缩小了基数的范围,缩小了递归的深度
图片详情

第二次提交
图片详情

直接使用vector的比较
图片详情

第三次提交
图片详情

第四次提交
剪枝
图片详情

第5次提交
终于ac了
图片详情

语法技术
python + c++
pow, log
vector中的等于赋值
gdb显示vector
一用就退出
debugger 不能显示二维数组
图片详情

toochain
图片详情

vector不是一个type
图片详情

可能是我接管了input和output的原因,新建一个project就ok了
图片详情

图片详情

不优化
这样又出bug了
图片详情

然后关了优化,关了 关优化,创建graph的部分被直接优化掉了
cal.py
代码详情
1 | from functools import reduce |
IntegerFactorization.py
代码详情
1 | def summit(): |
IntegerFactorization.cpp
代码详情
1 | // |
other1103.cpp
代码详情
1 | #include <iostream> |
尝试修改第一份手稿.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1104总结
考点
- 求和
问题重述
Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence { 0.1, 0.2, 0.3, 0.4 }, we have 10 segments: (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) and (0.4).Now given a sequence, you are supposed to find the sum of all the numbers in all the segments. For the previous example, the sum of all the 10 segments is 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer $N$, the size of the sequence which is no more than $10^5$. The next line contains $N$ positive numbers in the sequence, each no more than 1.0, separated by a space.
Output Specification:
For each test case, print in one line the sum of all the numbers in all the segments, accurate up to 2 decimal places.
Sample Input:
40.1 0.2 0.3 0.4
Sample Output:
5.00
Thanks to Ruihan Zheng for correcting the test data.
要点复述
边界点
思路
cpp
语法技术
第一次提交
图片详情

第二次提交
超时,找规律
图片详情

第三次提交
数据溢出,使用long double
图片详情

SumOfNumberSegments.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1105总结
考点
- 模拟
- Spiral Matrix
问题重述
This time your job is to fill a sequence of $N$ positive integers into a spiral matrix in non-increasing order. A spiral matrix is filled in from the first element at the upper-left corner, then move in a clockwise spiral. The matrix has $m$ rows and $n$ columns, where $m$ and $n$ satisfy the following: $m\times n$ must be equal to $N$; $m\ge n$; and $m-n$ is the minimum of all the possible values.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer $N$. Then the next line contains $N$ positive integers to be filled into the spiral matrix. All the numbers are no more than $10^4$. The numbers in a line are separated by spaces.
Output Specification:
For each test case, output the resulting matrix in $m$ lines, each contains $n$ numbers. There must be exactly 1 space between two adjacent numbers, and no extra space at the end of each line.
Sample Input:
1 | 12 |
Sample Output:
1 | 98 95 93 |
要点复述
螺旋矩阵:参考文献
边界点
思路
参考文献
具有参考价值的思路
- 三元运算符缩短cout的代码
- 位移向量的设计
- 模运算循环位移向量
cpp
第一次提交
一超时,两错误
超时是因为3*3这种情况
图片详情

第二次提交
图片详情

第三次提交
5*1的情况没有处理好
图片详情

语法技术
循环迭代器
二维数组初始化
LookAndSaySequence.py
代码详情
1 | # 数据生成 |
SpiralMatrix.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1106总结
考点
- 树
- 层次遍历
- 树
- 层次遍历
问题重述
图片详情

和pta1090(HighestPriceInSupplyChain)是镜像题
要点复述
边界点
思路
cpp
图片详情

LowestPriceInSupplyChain.py
代码详情
1 | def summit(): |
LowestPriceInSupplyChain.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1107总结
考点
- 并查集
问题重述
图片详情

要点复述
边界点
思路
cpp
第一次提交
图片详情

第二次提交
防止第一次没有正确cluster,之后cluster进去
但依旧没过
图片详情

语法技术
SocialClusters.py
代码详情
1 | edges = ['AB', 'AC', 'AD', 'IL', 'MK', 'IM', 'IJ', 'ED', 'HG', 'HF', 'BG', 'DI'] # 边 |
SocialClusters.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1108总结
考点
- 字符串处理
- 字符串处理
问题重述
Details
- decimal 还有小数的意思,题目中的2 decimal places表示两位小数
python
语法技术
- 匹配题目要求中字符串的正则表达式:
r"^[-]?[1]?\d{1,3}(\.\d{0,2})?$"- 用()来限定子表达式
- 注意要转义
.
- 格式化浮点数
f"{2.2222:.2f}" - 主要有小数不要用
int()转型,用float()转型
与正则勾心斗角
- 第二种bug:匹配了
2.3.4
Details
- 第二种bug:
r"^[-]?(1000|\d{1,2})?\d(\.\d{0,2})?$",re.compile(r"^[-]?((1000)|\d{1,2})?\d(\.\d{0,2})?$")匹配不了1000 - 原因多了一个
\d
Details
第一次提交
Details
测试点2,3未过
测试点2的奇怪点
没有.2f就过不了,意味着?哦哦,他是2.0我要保留为2.00
$\color{red}{\text{读题}}$,记得只有一位的时候是number
Details
测试点3参考文献
气急败坏
如果用到了比较离谱的知识点就思路偏了?
FindingAverage.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1109总结
考点
- 指数求和
问题重述
This time, you are supposed to find $A\times B$ where $A$ and $B$ are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:$K$ $N_1$ $a_{N_1}$ $N_2$ $a_{N_2}$ … $N_K$ $a_{N_K}$where $K$ is the number of nonzero terms in the polynomial, $N_i$ and $a_{N_i}$ ($i=1, 2, \cdots , K$) are the exponents and coefficients, respectively. It is given that $1\le K \le 10$, $0 \le N_K < \cdots < N_2 < N_1 \le 1000$.
Output Specification:
For each test case you should output the product of $A$ and $B$ in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
Sample Input:
1 | 2 1 2.4 0 3.22 2 1.5 1 0.5 |
Sample Output:
1 | 3 3 3.6 2 6.0 1 1.6 |
要点复述
之前做过一份相加的这份是求乘积的不太一样
边界点
思路
cpp
第一次提交
图片详情

第二次提交
图片详情

语法技术
反向迭代器
ProductOfPolynomials.py
代码详情
1 | def summit(): |
ProductOfPolynomials.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1110总结
考点
- 二叉树
- 完全二叉树
- 层次遍历
- 完全二叉树
问题重述
图片详情

要点复述
判断一棵树是不是完全二叉树
边界点
思路
思路:层次遍历的结果中间不可能有空节点
python
第一次提交
图片详情

第二次提交
图片详情

CompleteBinaryTree.py
代码详情
1 | from typing import List, Dict, Union |
data.json
代码详情
1 | [ |
PTA1111总结
考点
- 最短路径
问题重述
图片详情

- Q:题目中的one-way是什么意思?干扰变量?
- A:干扰变量
要点复述
求最短路径和最快路径,相当于求两次dijkstra
边界点
思路
python
第一次提交
图片详情

cpp
语法技术
vector的比较
第一次提交
图片详情

OnlineMap.py
代码详情
1 | """ |
OnlineMap.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1113总结
考点
- 排序
- 排序
问题重述
图片详情

要点复述
- 怎么感觉这道题很经典了,集合划分,而且好像做过?
- 之前是有负数的,这次只有正数
- 排序之后求和的差就好,极度简单
坑点
实测有空行
python
思路
要想长度的差最小,就是均分两段列表,只有两种情况,原始列表为奇数或者偶数
如果是奇数,长度差必为1
如果是偶数,长度差必为0
要想两段的和最大,那么就是按照大小排序,在划分等长的两段即可
第一次提交
图片详情

IntegerSetPartition.py
代码详情
1 | def summit(): |
data.json
代码详情
1 | [ |
PTA1115总结
考点
- 二叉树
- 二叉排序树
- 层次遍历
问题重述
图片详情

要点复述
边界点
- 只有一层?
- 递归算法有可能超过递归栈
- 读题
思路
python
第一次提交
图片详情

图片详情

第二次提交
题目改了以往的设定
图片详情

第三次
递归限制
图片详情

第四次
图片详情

CountingNodesInBST.py
代码详情
1 | from typing import List, Dict, Union |
data.json
代码详情
1 | [ |
PTA1119总结
考点
- 二叉树
- 前序遍历
- 中序遍历
- 后序遍历
- 二叉树
问题重述
图片详情

要点复述
已知后序和先序,求中序遍历
边界点
- 只有一个节点#测试点5
- label不是按照0-nodesNum来的
思路
Q:给定一定数量的节点二叉树的可能性有多少种?
Q:todo
联系前序后序的输出算法,发现也许可以用栈解决问题,前序序列是节点入栈的序列,后序序列是节点入栈的序列
影响入栈顺序的因素有哪些?先压入左孩子,没有左孩子了,出栈,压入右孩子
- a比b压栈的可能情况:a是b的双亲及以上辈分的节点,a是b的父亲节点的左孩子
影响出栈顺序的因素有哪些?出栈的前提是他在栈顶,当前节点的孩子都不在栈中了
定理1: 栈中任意两个相邻元素一定是父子关系,即模拟出栈至少可以确定一棵树
定理2:如果一个树有两个孩子,出现在前序序列前面一定是左孩子,出现在前序序列后面的是左孩子,如果只有一个孩子,这个孩子是左孩子还是右孩子不确定
定理3:由定理2易得,如果一棵树只有度为0或者度为2的节点那么如果得到任何一个遍历序列,可以唯一确定一颗二叉树
定理4: 由定理3可推,如果节点的个数为偶数必不唯一
推导过程
易得$n_0 + n_2 = 2n_2 + 1$ 即$n_0 = n_2 + 1$ $\text{总节点数} = n_0 + n_2 = 2_n2 + 1$ 所以只有度为0或者度为2的节点的树的节点总数为奇数python
第一次提交
图片详情

第二次提交
图片详情

语法技术
analyse.py
代码详情
1 | from .PreAndPostOrderTraversals import Node |
PreAndPostOrderTraversals.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1123总结
考点
- 平衡二叉树
- 完全二叉树
- 平衡二叉树的插入
- 层次遍历
问题重述
图片详情

要点复述
边界点
思路
判断方法见pta1110,建立平衡二叉树的方法见pta1066
python
图片详情

语法技术
IsItACompleteAVLTree.py
代码详情
1 | from __future__ import annotations |
data.json
代码详情
1 | [ |
PTA1125总结
考点
- 排序
- 排序
- 猜题意
问题重述
图片详情

要点复述
排序最大的两个相加/2,但不能大于最长的长度
并且可以不断的折
坑点
实测有空行
神坑:要把所有的绳子都折到一起
必须加了之后再四舍五入
python
第一次提交
图片详情

version1
图片详情

version2
图片详情

测试点1的答案5001
最后一次提交
reduce的起点必须是num[0],然后从num[1:]开始reduce,
此操作再cpp中可使用accumulate实现,c17后可使用reduce
图片详情

ChaintheRopes.py
代码详情
1 | from functools import reduce |
data.json
代码详情
1 | [ |
PTA1126总结
考点
- 欧拉路径
问题重述
图片详情

题目已经说明了什么怎么样的图存在欧拉路径
It has been proven that connected graphs with all vertices of even degree have an Eulerian circuit, and such graphs are called Eulerian. If there are exactly two vertices of odd degree, all Eulerian paths start at one of them and end at the other. A graph that has an Eulerian path but not an Eulerian circuit is called semi-Eulerian
要点复述
边界点
图是否连通
思路
A.判断欧拉通路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
B.判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
python
第一次提交
1错,1非零,1超时
图片详情

第二次提交
解决非0
图片详情

提交效率
就这样还超时,读取的时候已经超时
图片详情

cpp
第一次提交
图片详情

第二次提交
图片详情

EulerianPath.py
代码详情
1 | from typing import List |
EulerianPath.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1127总结
考点
- 二叉树
- 中序遍历
- 后序遍历
- 层次遍历
问题重述
图片详情

要点复述
边界点
思路
层次遍历的时候记录每一层的节点,然后从第二层开始隔一层反转
python
第一次提交
图片详情

ZigZagOnTree.py
代码详情
1 | """ |
data.json
代码详情
1 | [ |
PTA1130总结
考点
- 二叉树
- 中缀表达式
- 中序遍历
问题重述
要点复述
边界点
思路
想象一个递归栈?中序遍历就相当于往两边加括号
python
第一次提交
图片详情

第二次提交
图片详情

语法技术
InfixExpression.py
代码详情
1 | from typing import List |
data.json
代码详情
1 | [ |
PTA1131总结
考点
- BFS
- DFS
- 无权图最短路径
问题重述
图片详情

图片详情

图片详情

Each station interval belongs to a unique subway line. Although the lines may cross each other at some stations (so called “transfer stations”), no station can be the conjunction of more than 5 lines.
- 这句话有啥用
为什么不能用dikstra?
要点复述
边界点
思路
cpp
第一次提交
图片详情

第二次提交
图片详情

第三次提交
图片详情

语法技术
SubwayMap.py
代码详情
1 | def summit(): |
SubwayMap.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1133总结
问题重述
图片详情

cpp
没有main的话,平台的报错1
2
3/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
第一次提交
测试点2-4 WA
- len=0不输出
图片详情

第二次提交
图片详情

SplittingALinkedList.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1134总结
考点
- 其他的图论
- 边点集
问题重述
图片详情

要点复述
给定点集,点的边包含图中所有的边
边界点
思路
每删除读一个点删除和这个点连接的边
cpp
第一次提交
图片详情

VertexCover.py
代码详情
1 | def summit(): |
VertexCover.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1135总结
考点
- 二叉树
- 红黑树
- 二叉搜索树
- 节点路径
- 层次遍历
- 二叉树
- 红黑树
问题重述
图片详情

figure2:
违反了规则4:2的孩子7应该是黑色
figure3:
违反了规则5:10-11(两个红色节点),10-17(3个黑色节点),到叶子节点的黑色节点数不相等
要点复述
判断一棵树是不是红黑树
边界点
需要将空节点进行显示设置
思路
红黑树参考文献
红黑树首先是一颗二叉排序树,前序遍历就可以把这个二叉排序树构建出来,
- 检查根节点是不是黑色的
- 检查红色节点的孩子是不是都是黑色的
- 用双亲表示法,快速找到路径上的父亲,用孩子表示法可以快速找孩子(确定是不是叶子节点)
python
第一次提交
图片详情

第二次提交
可以看到第二个和第三个测试数据出错了
图片详情

需要给所有的空节点添加上nil节点
图片详情

图片详情

图片详情

IsItARedBlackTree.py
代码详情
1 | from __future__ import annotations |
other.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1140总结
考点
- 字符串处理
- 字符串
问题重述
Details
- 读题
- 琢磨了很久,他是某个数字连续出现了几次,,,,
- 坑点2:他的step到底是啥
python
语法技术
一命过
Details
LookAndSaySequence.py
代码详情
1 | def say(num: str, step: int) -> str: |
data.json
代码详情
1 | [ |
PTA1141总结
考点
- 排序
- 排序
问题重述
图片详情

要点复述
- 每个学校的代码要全部转为小写
- 按照TWS(total weighted score)加权总分排序
- 加权总分一致排名一致
- 排名一致输出,按照做对的题数递增排序
- 仍旧无法区分,按照学校代码升序
坑点
- 结尾有空行
cpp
思路
第一次提交
测试点不通过
图片详情

第二次提交
使用读入加速技术大概能快50ms在大数据集的情况下10^5
运算的前后顺序会造成精度上的差距,严格按照题目意思走
图片详情

语法技术
tolower()
clion
报错?
图片详情

PATRankingOfInstitutions.py
代码详情
1 | def summit(): |
PATRankingOfInstitutions.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1142总结
考点
- DFS
- Clique
问题重述
两个点间都是直接连接的
要点复述
边界点
思路
bfs
cpp
第一次提交
图片详情

第二次提交
图片详情

语法技术
集合的交并补
就地交集
集合的关系运算
unorder_set不支持==比较
循环体变量的生命周期
循环体中创建的变量只有一次循环的生命,下一次循环会重新初始化
参考文献
子集判断
MaximalClique.py
代码详情
1 | def summit(): |
MaximalClique.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1146总结
考点
- 拓扑排序
问题重述
要点复述
图片详情

边界点
思路
cpp
第一次提交
图片详情

语法技术
set
方便快速找元素在不在里面
bitset
使用bitset代替bool
不要使用vector
filter in vector
copy_if
TopologicalOrder.py
代码详情
1 | def summit(): |
TopologicalOrder.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1147总结
考点
- 二叉树
- 堆
- 层次遍历
- 后序遍历
- 堆
- 二叉树
问题重述
图片详情

要点复述
给定层次遍历,判断其是不是堆,并且输出后序遍历
(用python可能会超时?为了加快速度,直接用非递归的后序遍历
边界点
思路
后序遍历的非递归实现 王立波有一版,感觉思路跟我不一样,感觉他为了配合这个空节点写的很丑。
- 我的思路不会压入空节点(尽管在实际的函数调用栈会压入空节点
Q: 递归和非递归谁更快?虽然都是O(n)# todo
python
第一次提交
图片详情

语法技术
cpp
看到一个人直接设置一个全局变量数组,将这个数组的index作为“地址”索引node哈哈哈
记得using name space
关于结构体
c++中结构体需不需要typedef,不需要
思路1:
复刻python代码
cpp没有引用数组,如何实现python中的nodes?
- 使用指针数组
- 使用对象数组
如何传递指针数组中的值?
思路1:间接寻址再传递引用
思路2:传递指针的引用,
重载关系运算符
Method ‘operator<’ can be made const
cpp对递归栈有深度限制吗?
一般来说看系统
如何实现python中某个函数的默认赋值?
函数的重载
vector推导式?
cpp中貌似没有这样的语法糖
关于构造函数中出现形参成员变量
c++中的this指针
c++中的智能指针与垃圾回收
vector对象的生命周期
explicit关键字
关于取地址
为什么不能直接对nodes[0]取地址?传给后序遍历
reinterpret_cast
关于递归栈的深度
第一次提交
图片详情

使用了读入加速,居然在小数据上还慢了?
图片详情

Heaps.py
代码详情
1 | from typing import List |
Heaps.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1150总结
考点
- 旅行商问题
- 最短路径
问题重述
图片详情

- simple cycle和cycle的区别
- 城市节点从1开始编号,query从1开始编号
要点复述
Not a TS cycle 以下情况
- 没有经过图中所有的节点
- 没有回到最初的起点
- 访问了不存在的边
TS cycle
- 有被重入的点
TS simple cycle
- 没有点被重入
边界点
思路
节点从1开始标,适合临界矩阵
cpp
第一次提交
图片详情

TravellingSalesmanProblem.py
代码详情
1 | def summit(): |
TravellingSalesmanProblem.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1151总结
考点
- 二叉树
- 前序遍历
- 中序遍历
- 二叉树
问题重述
图片详情

要点复述
找最近公共祖先
边界点
思路
通过中序和前序构建出二叉树
然后找到两个节点,从根节点到其的路径,寻找最长公共前缀
- 为了加速可以为路径建立一个缓存,就不用再次搜索了
cpp
第一次提交
图片详情

建树的时候就内存超时了
- 法1传引用和左右下标
- 法2:将preorderSeq,inorderSeq,nodes设为全局变量全局变量
- 不再用递归来插入节点
第二次提交
运行超时,加入缓存机制,直接使用缓存中的变量
图片详情

第二次提交
加入缓存机制
图片详情

才用了100ms不到
这么说。感觉用python也能过。。。。。
语法技术
slice vector
跟python一样是左闭右开
找到某个元素值的index
vector.end()指向最后一个元素的下一个元素的位置
释放vector of pointers的内存
不能比较两个指针
查找一个key是不是在map中
LCAInABinaryTree.py
代码详情
1 | def summit(): |
LCAInABinaryTree.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1152总结
考点
- 质数
- 质数
问题重述
Details
质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
0既不是质数也不是合数
1是不是素数:参考文献
2是素数
python
第一次提交
最后一个测试点超时
Details
优化
for i in range(2, int(log2(num)) + 1)
为什么过不了测试点3?:$\color{red}{\text{log2不是sqrt}}$
第二次提交
Details
c++
Details
第一次提交
Details
第二次提交
Details
GoogleRecruitment.py
代码详情
1 | from math import sqrt |
GoogleRecruitment.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1153总结
考点
- 模拟
问题重述
图片详情

要点复述
边界点
注意格式化占位输出
思路
cpp
第一次提交
图片详情

第二次提交
图片详情

第三次提交
使用cin,cout加速技术
图片详情

语法技术
判断map中存不存在key
find
LookAndSaySequence.py
代码详情
1 | def summit(): |
DecodeRegistrationCardOfPAT.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1154总结
考点
- 顶点着色
- 水题
问题重述
A proper vertex coloring is a labeling of the graph’s vertices with colors such that no two vertices sharing the same edge have the same color. A coloring using at most $k$ colors is called a (proper) $k$-coloring.Now you are supposed to tell if a given coloring is a proper $k$-coloring.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers $N$ and $M$ (both no more than $10^4$), being the total numbers of vertices and edges, respectively. Then $M$ lines follow, each describes an edge by giving the indices (from 0 to $N-1$) of the two ends of the edge.After the graph, a positive integer $K$ ($\le$ 100) is given, which is the number of colorings you are supposed to check. Then $K$ lines follow, each contains $N$ colors which are represented by non-negative integers in the range of int. The $i$-th color is the color of the $i$-th vertex.
Output Specification:
For each coloring, print in a line k-coloring if it is a proper k-coloring for some positive k, or No if not.
Sample Input:
1 | 10 11 |
Sample Output:
1 | 4-coloring |
要点复述
边界点
- 每条边只存一次
- 用邻接表存储结构
思路
cpp
第一次提交
图片详情

语法技术
VertexColoring.py
代码详情
1 | def summit(): |
VertexColoring.cpp
代码详情
1 | // |
data.json
代码详情
1 | [ |
PTA1155总结
考点
- 二叉树
- 堆
- 堆
- 二叉树
问题重述
图片详情

要点复述
输出每一个到
边界点
思路
输出和检查分开,使用RL递归搜索(用一个栈来记录),判断使用传统方法,时间复杂度为O(n)
python
图片详情

HeapPaths.py
代码详情
1 | """ |
data.json
代码详情
1 | [ |
王道-操作系统-ch5-输入输出IO管理
王道
输入/输出(I/O)管理
【考纲内容】
(一)I/O管理基础
- 设备(设备的基本概念,设备的分类,I/O接口,I/O端口)
- I/O控制方式(轮询方式、中断驱动方式、DMA方式)
- I/O 软件层次结构(用户层I/O、设备独立性软件、设备驱动层、中断处理层、硬件层)
- $\color{red}{\text{输入/输出}}$ 应用程序接口(字符设备接口,块设备接口,网络设备接口,阻塞/非阻塞I/O)
(二)设备独立软件
- 缓冲区管理
- 设备分配与回收
- 假脱机技术(SPOOLing)
- $\color{red}{\text{设备驱动程序接口}}$
(三)外存管理
- 磁盘(磁盘结构,格式化,分区,磁盘调度方法)
- $\color{red}{\text{固态硬盘}}$ (读写性能特性,磨损均衡)
- 概述
- I/O设备分类
- I/O控制方式—程序直接控制、中断驱动方式、DMA方式、通道方式
- I/O层次结构——用户层I/O、设备独立性软件、设备驱动层、中断处理层、硬件层
- 缓冲区
- 单缓冲
- 双缓冲
- 循环缓冲
- 缓冲池
- 缓冲区与高速缓存的对比
- 设备分配
- 概述
- 独占设备————独占式使用
- 共享设备————分时式共享
- 虚拟设备————SPOOLing方式
- 数据结构————DCT、COCT、CHCT、SDT
- 策略————静态分配、动态分配
- 逻辑设备名到物理设备名的映射
- 概述
- SPOOLing系统(虚拟设备技术)————组成、实例
【复习提示】
本章的内容较为分散,重点掌握的内容是I/O设备的基本特性、I/O子系统的特性、三种IO控制方式、高速缓存与缓冲区、SPOOLing 技术。本章的知识点很多,如I/O方式、设备控制等内容与硬件直接相关,建议结合计算机组成原理中的对应章节一起复习。本章内容与组成原理中的交叉较多,很多考点既可作为本章的考点,又可作为组成原理中的考点,因此还未复习组成原理的读者需要清楚地把握本章的每个知识点,为组成原理的学习打下基础,已复习过组成原理的读者遇到比较熟悉的内容时可以跳过,学习本章中组成原理未涉及的部分即可。另外,未复习过组成原理的读者可能会觉得本章的习题较难,但不需要担心。
本章的内容历年来在统考题目中所占的比例不大,若统考中出现本章的题目,则基本上可以断定一定非常简单,看过相关内容的读者就一定会做,而未看过的读者基本上只能靠“蒙”。考研成功的秘诀是复习要反复多次并全面,偷工减料是要吃亏的,希望读者重视本章的内容。
- 这么说来通道不考了?
- 通道和DMA的区别
I/O管理概述
学习本章时,可与计算机组成原理的相关知识相结合,并思考I/O管理要完成哪些功能。
I/O设备
I/O设备管理是操作系统设计中最凌乱也最具挑战性的部分。由于它包含了很多领域的不同设备及与设备相关的应用程序,因此很难有一个通用且一致的设计方案。所以在理解设备管理之前,应该先了解具体的IO设备类型。
计算机系统中的IO设备按使用特性可分为以下类型:
1) $\color{green}{\text{人机交互类外部设备}}$ 。用于与计算机用户之间交互的设备,如打印机、显示器、鼠标、键盘等。这类设备的数据交换速度相对较慢,通常是以字节为单位进行数据交换的。
2) $\color{green}{\text{存储设备}}$ 。用于存储程序和数据的设备,如磁盘、磁带、光盘等。这类设备用于数据交换,速度较快,通常以多字节组成的块为单位进行数据交换。
3) $\color{green}{\text{网络通信设备}}$ 。用于与远程设备通信的设备,如各种网络接口、调制解调器等。其速度介于前两类设备之间。网络通信设备在使用和管理上与前两类设备也有很大不同。
除了上面最常见的分类方法,IO设备还可以按以下方法分类。
按传输速率分类
1) $\color{red}{\text{低速设备}}$ 。传输速率仅为每秒几字节到数百字节的一类设备,如 $\color{green}{\text{键盘}}$ 、 $\color{green}{\text{鼠标}}$ 等。
2) $\color{red}{\text{中速设备}}$ 。传输速率为每秒数千字节至数万字节的一类设备,如 $\color{green}{\text{行式打印机}}$ 、 $\color{green}{\text{激光打印机}}$ 等。
3) $\color{red}{\text{高速设备}}$ 。传输速率在数百千字节至千兆字节的一类设备,如 $\color{green}{\text{磁带机}}$ 、 $\color{green}{\text{磁盘机}}$ 、 $\color{green}{\text{光盘机}}$ 等。
按信息交换的单位分类
1) $\color{red}{\text{块设备}}$ 。由于信息的存取总是以数据块为单位的,所以存储信息的设备称为块设备。它属于有结构设备,如 $\color{green}{\text{磁盘}}$ 等。磁盘设备的基本特征是传输速率较高、可寻址,即对它可随机地读/写任一块。
2) $\color{red}{\text{字符设备}}$ 。用于数据输入/输出的设备为字符设备,因为其传输的基本单位是字符。它属于无结构类型,如 $\color{green}{\text{交互式终端机}}$ 、 $\color{green}{\text{打印机}}$ 等。它们的基本特征是传输速率低、不可寻址,并且在输入/输出时常采用中断驱动方式。
I/O控制方式
设备管理的主要任务之一是控制设备和内存或处理机之间的数据传送。外围设备和内存之间的输入/输出控制方式有4种,下面分别加以介绍。
程序直接控制方式
如图5.1(a)所示,计算机从外部设备读取数据到存储器,每次读一个字的数据。对读入的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在IO控制器的数据寄存器中。在程序直接控制方式中,由于CPU的高速性和IO设备的低速性,致使CPU的绝大部分时间都处于等待IO设备完成数据IO的循环测试中,造成了CPU资源的极大浪费。在该方式中,CPU之所以要不断地测试IO设备的状态,就是因为在CPU中未采用中断机构,使IO设备无法向CPU报告它已完成了一个字符的输入操作。
程序直接控制方式虽然简单且易于实现,但其缺点也显而易见,由于CPU和I/O设备只能串行工作,导致CPU的利用率相当低。
中断驱动方式
中断驱动方式的思想是,允许IO设备主动打断CPU的运行并请求服务,从而“解放”CPU,使得其向I/O控制器发送读命令后可以继续做其他有用的工作。如图5.1(b)所示,我们从IO控制器和CPU两个角度分别来看中断驱动方式的工作过程。
图5.1 I/O控制方式

从I/O控制器的角度来看,I/O控制器从CPU接收一个读命令,然后从外围设备读数据。一旦数据读入该I/O控制器的数据寄存器,便通过控制线给CPU发出一个中断信号,表示数据已准备好,然后等待CPU请求该数据。I/O控制器收到CPU 发出的取数据请求后,将数据放到数据总线上,传到CPU的寄存器中。至此,本次I/O操作完成,IO控制器又可开始下一次I/O操作。
从CPU的角度来看,CPU 发出读命令,然后保存当前运行程序的上下文(现场,包括程序计数器及处理机寄存器),转去执行其他程序。在每个指令周期的末尾,CPU 检查中断。当有来自I/O控制器的中断时,CPU保存当前正在运行程序的上下文,转去执行中断处理程序以处理该中断。这时,CPU 从IO控制器读一个字的数据传送到寄存器,并存入主存。接着,CPU恢复发出1O命令的程序(或其他程序)的上下文,然后继续运行。
中断驱动方式比程序直接控制方式有效,但由于数据中的每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。
DMA方式
在中断驱动方式中,I/O 设备与内存之间的数据交换必须要经过CPU中的寄存器,所以速度还是受限,而DMA(直接存储器存取)方式的基本思想是在IO设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU。DMA方式的特点如下:
1)基本单位是数据块。
2)所传送的数据,是从设备直接送入内存的,或者相反。
3)仅在传送一个或多个数据块的开始和结束时,才需CPU干预,整块数据的传送是在DMA控制器的控制下完成的。
图5.2列出了DMA控制器的组成。
图5.2 DMA控制器的组成

要在主机与控制器之间实现成块数据的直接交换,须在DMA控制器中设置如下4类寄存器:1)命令/状态寄存器(CR)。用于接收从CPU 发来的I/O命令或有关控制信息,或设备的状态。
2)内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
3)数据寄存器(DR)。用于暂存从设备到内存或从内存到设备的数据。
4)数据计数器(DC)。存放本次要传送的字(节)数。
如图5.1(c)所示,DMA方式的工作过程是:CPU 接收到IO设备的DMA请求时,它给TO控制器发出一条命令,启动DMA 控制器,然后继续其他工作。之后CPU就把控制操作委托给DMA控制器,由该控制器负责处理。DMA 控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要CPU参与。传送完成后,DMA 控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要CPU的参与。
DMA 控制方式与中断驱动方式的主要区别是,中断驱动方式在每个数据需要传输时中断CPU,而DMA控制方式则是在所要求传送的一批数据全部传送结束时才中断CPU;此外,中断驱动方式数据传送是在中断处理时由CPU控制完成的,而 DMA 控制方式则是在 DMA控制器的控制下完成的。
通道控制方式
I/O通道是指专门负责输入/输出的处理机。I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预。同时,又可以实现CPU、通道和IO设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
例如,当CPU要完成一组相关的读(或写)操作及有关控制时,只需向IO通道发送一条I/O指令,以给出其所要执行的通道程序的首地址和要访问的IO设备,通道接到该指令后,执行通道程序便可完成CPU指定的IO任务,数据传送结束时向CPU 发中断请求。
IO通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU $\color{green}{\text{共享内存}}$ 。
IO通道与DMA方式的区别是:DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个 DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。
下面用一个例子来总结以上4种IO控制方式。想象一位客户要去裁缝店做一批衣服的情形。采用程序直接控制时,裁缝没有客户的联系方式,客户必须每隔一段时间去裁缝店看看裁缝把衣服做好了没有,这就浪费了客户不少的时间。
采用中断驱动方式时,裁缝有客户的联系方式,每当他完成一件衣服后,给客户打一个电话,让客户去拿,与程序直接控制能省去客户不少麻烦,但每完成一件衣服就让客户去拿一次,仍然比较浪费客户的时间。
采用DMA方式时,客户花钱雇一位单线秘书,并向秘书交代好把衣服放在哪里(存放仓库),裁缝要联系就直接联系秘书,秘书负责把衣服取回来并放在合适的位置,每处理完100件衣服,秘书就要给客户报告一次(大大节省了客户的时间)。
采用通道方式时,秘书拥有更高的自主权,与 DMA方式相比,他可以决定把衣服存放在哪里,而不需要客户操心。而且,何时向客户报告,是处理完100件衣服就报告,还是处理完10000件衣服才报告,秘书是可以决定的。客户有可能在多个裁缝那里订了货,一位DMA类的秘书只能负责与一位裁缝沟通,但通道类秘书却可以与多名裁缝进行沟通。
I/O子系统的层次结构
IO 软件涉及的面非常广,往下与硬件有着密切的联系,往上又与用户直接交互,它与进程管理、存储器管理、文件管理等都存在着一定的联系,即它们都可能需要IO软件来实现IO操作。
为了使复杂的IO软件具有清晰的结构、良好的可移植性和适应性,在IO软件中普遍采用了层次式结构,将系统输入/输出功能组织成一系列的层次,每层都利用其下层提供的服务,完成输入/输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。在层次式结构的I/O软件中,只要层次间的接口不变,对某一层次中的软件的修改都不会引起其下层或高层代码的变更,仅最低层才涉及硬件的具体特性。
一个比较合理的层次划分如图5.3所示。整个IO系统可以视为具有4个层次的系统结构,各层次及其功能如下:
图5.3 I/O层次结构

1) $\color{red}{\text{用户层IO软件}}$ 。实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的 $\color{green}{\text{库函数}}$ ,对设备进行操作。
一般而言,大部分的I/O软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数,以及完全运行于内核之外的一些程序。用户层软件必须通过一组系统调用来获取操作系统服务。
2) $\color{red}{\text{设备独立性软件}}$ 。用于实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
设备独立性也称设备无关性,使得应用程序独立于具体使用的物理设备。为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。使用逻辑设备名的好处是:①增加设备分配的灵活性;②易于实现IO重定向,所谓IO重定向,是指用于IO操作的设备可以更换(即重定向),而不必改变应用程序。
为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。总体而言,设备独立性软件的主要功能可分为以下两个方面:
①执行所有设备的公有操作。包括:对设备的分配与回收;将逻辑设备名映射为物理设备名;对设备进行保护,禁止用户直接访问设备;缓冲管理;差错控制;提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的差异。
②向用户层(或文件层)提供统一接口。无论何种设备,它们向用户所提供的接口应是相同的。例如,对各种设备的读/写操作,在应用程序中都统一使用read/write命令等。
3) $\color{red}{\text{设备驱动程序}}$ 。与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动IO设备工作的驱动程序。
通常,每类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,常以进程形式存在。设备驱动程序向上层用户程序提供一组标准接口,设备具体的差别被设备驱动程序所封装,用于接收上层软件发来的抽象IO要求,如read和 write命令,转换为具体要求后,发送给设备控制器,控制IO设备工作;它也将由设备控制器发来的信号传送给上层软件,从而为IO内核子系统隐藏设备控制器之间的差异。
4) $\color{red}{\text{中断处理程序}}$ 。用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完并恢复被中断进程的现场后,返回到被中断进程。
中断处理层的主要任务有:进行进程上下文的切换,对处理中断信号源进行测试,读取设备状态和修改进程状态等。由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,因此应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
5) $\color{red}{\text{硬件设备}}$ 。I/O设备通常包括一个机械部件和一个电子部件。为了达到设计的模块性和通用性,一般将其分开:电子部件称为设备控制器(或适配器),在个人计算机中,通常是一块插入主板扩充槽的印制电路板;机械部件则是设备本身。
设备控制器通过寄存器与CPU通信,在某些计算机上,这些寄存器占用内存地址的一部分,称为内存映像IO;另一些计算机则采用IO专用地址,寄存器独立编址。操作系统通过向控制器寄存器写命令字来执行IO功能。控制器收到一条命令后,CPU可以转向进行其他工作,而让设备控制器自行完成具体的I/O操作。当命令执行完毕后,控制器发出一个中断信号,操作系统重新获得CPU的控制权并检查执行结果,此时,CPU仍旧从控制器寄存器中读取信息来获得执行结果和设备的状态信息。
设备控制器的主要功能如下:
1)接收和识别CPU或通道发来的命令,如磁盘控制器能接收读、写、查找等命令。
2)实现数据交换,包括设备和控制器之间的数据传输;通过数据总线或通道,控制器和主存之间的数据传输。
3)发现和记录设备及自身的状态信息,供CPU处理使用。
4)设备地址识别。
为实现上述功能,设备控制器(见图5.4)必须包含以下组成部分:
① $\color{green}{\text{设备控制器与CPU的接口}}$ 。该接口有三类信号线:数据线、地址线和控制线。数据线通常与两类寄存器相连:数据寄存器(存放从设备送来的输入数据或从CPU送来的输出数据)和控制/状态寄存器(存放从CPU送来的控制信息或设备的状态信息)。
② $\color{green}{\text{设备控制器与设备的接口}}$ 。设备控制器连接设备需要相应数量的接口,一个接口连接一台设备。每个接口中都存在数据、控制和状态三种类型的信号。
${\textstyle\unicode{x2462}}$ $\color{green}{\text{IO控制逻辑}}$ 。用于实现对设备的控制。它通过一组控制线与CPU交互,对从CPU收到的I/O命令进行译码。CPU启动设备时,将启动命令发送给控制器,同时通过地址线把地址发送给控制器,由控制器的IO逻辑对地址进行译码,并相应地对所选设备进行控制。
图5.4设备控制器的组成

类似于文件系统的层次结构,IO子系统的层次结构也是我们需要记忆的内容,但记忆不是死记硬背,我们以用户对设备的一次命令来总结各层次的功能,帮助各位读者记忆。
例如,当用户要读取某设备的内容时,通过操作系统提供的read命令接口,这就经过了用户层。
操作系统提供给用户使用的接口,一般是统一的通用接口,也就是几乎每个设备都可以响应的统一命令,如read 命令,用户发出的read命令,首先经过设备独立层进行解析,然后交往下层。
接下来,不同类型的设备对read命令的行为会有所不同,如磁盘接收read 命令后的行为与打印机接收read命令后的行为是不同的。因此,需要针对不同的设备,把read 命令解析成不同的指令,这就经过了设备驱动层。
命令解析完毕后,需要中断正在运行的进程,转而执行read 命令,这就需要中断处理程序。
最后,命令真正抵达硬件设备,硬件设备的控制器按照上层传达的命令操控硬件设备,完成相应的功能。
本节小结
本节开头提出的问题的参考答案如下。
IO管理要完成哪些功能?
I/O管理需要完成以下4部分内容:
1)状态跟踪。要能实时掌握外部设备的状态。
2)设备存取。要实现对设备的存取操作。
3)设备分配。在多用户环境下,负责设备的分配与回收。
4)设备控制。包括设备的驱动、完成和故障的中断处理。
I/O核心子系统
在学习本节时,请读者思考以下问题:
1)当处理机和外部设备速度差距较大时,并且此时不想让其中一方等待,有什么办法可以解决问题?
2)什么是设备的独立性?引入设备的独立性有什么好处?
I/O子系统概述
由于IO设备种类繁多,功能和传输速率差异巨大,因此需要多种方法来进行设备控制。这些方法共同组成了操作系统内核的I/O子系统,它将内核的其他方面从繁重的IO设备管理中解放出来。I/O核心子系统提供的服务主要有I/O调度、缓冲与高速缓存、设备分配与回收、假脱机、设备保护和差错处理等。
I/O调度概念
IO 调度就是确定一个好的顺序来执行这些IO请求。应用程序所发布的系统调用的顺序不一定总是最佳选择,所以需要IO调度来改善系统整体性能,使进程之间公平地共享设备访问,减少I/O完成所需要的平均等待时间。
操作系统开发人员通过为每个设备维护一个请求队列来实现调度。当一个应用程序执行阻塞IO系统调用时,该请求就加到相应设备的队列上。IO调度会重新安排队列顺序,以改善系统总体效率和应用程序的平均响应时间。
IO子系统还可使用主存或磁盘上的存储空间的技术,如缓冲、高速缓存、假脱机等来改善计算机效率。
4.3节的磁盘调度算法其实就是IO调度的一种。
高速缓存与缓冲区
磁盘高速缓存( Disk Cache)
操作系统中使用磁盘高速缓存技术来提高磁盘的IO速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,又存储在物理内存上,也被复制到CPU的二级和一级高速缓存中。
不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存 $\color{red}{\text{逻辑}}$ 上属于 $\color{green}{\text{磁盘}}$ , $\color{red}{\text{物理}}$ 上则是驻留在 $\color{green}{\text{内存}}$ 中的盘块。
高速缓存在内存中分为 $\color{green}{\text{两种形式}}$ :一种是在内存中开辟一个单独的存储空间作为磁盘高速缓存,大小固定;另一种是把未利用的内存空间作为一个缓冲池,供请求分页系统和磁盘IO时共享。
缓冲区(Buffer)
在设备管理子系统中,引入缓冲区的目的主要如下:
1)缓和CPU与VO设备间速度不匹配的矛盾。
2)减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
3)解决基本数据单元大小(即数据粒度)不匹配的问题。
4)提高CPU 和IO设备之间的并行性。
其实现方法如下:
1)采用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不采用硬件缓冲器。
2)采用缓冲区(位于内存区域)。
缓冲区有一个特点,即当缓冲区的数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满后,才能从缓冲区把数据传出。
根据系统设置缓冲器的个数,缓冲技术可以分为如下几种:
1) $\color{green}{\text{单缓冲}}$ 。在设备和处理机之间设置一个缓冲区。设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据。
如图5.5所示,在块设备输入时,假定从磁盘把一块数据输入缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为M,而 CPU对这一块数据处理的时间为C。在研究各种缓冲技术的每块数据的处理时间时,有一个技巧:假设一种初始状态,然后计算下一次到达相同状态时所需要的时间,就是处理一块数据所需要的时间。在单缓冲中,这种初始状态为:工作区是满的,缓冲区是空的。如题目没有明确说明,一般认为缓冲区的大小和工作区的大小相等。
我们假设T>C,从初始状态开始,当工作区数据处理完后,时间为C,缓冲区还没充满,当缓冲区充满时,经历了T时间,停止再冲入数据,然后缓冲区向工作区传送数据,当工作区满了以后,缓冲区的数据同时也为空,用时为M,到达下一个开始状态,整个过程用时M+T;若T< C,同理,整个过程用时M+C。所以单缓冲区处理每块数据的用时为max(C, T)+M。.
图5.5单缓冲工作示意图

2) $\color{green}{\text{双缓冲}}$ 。根据单缓冲的特点,CPU在传送时间M内处于空闲状态,由此引入双缓冲。IO设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理机可以从缓冲区1中取出数据放入用户进程处理,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理机又从缓冲区2中取出数据放入用户进程处理,而I/O设备又可以装填缓冲区1。注意,必须等缓冲区2充满才能让处理机从缓冲区2取出数据。双缓冲机制提高了处理机和输入设备的并行操作的程度。
为了研究双缓冲处理一块数据的用时,我们先规定一种初始状态:工作区是空的,其中一个缓冲区是满的,另外一个缓冲区是空的;我们不妨假设缓冲区1是空的,缓冲区2是满的。
如图5.6所示,我们假设T< C+M,缓冲区2开始向工作区传送数据,缓冲区1开始冲入数据,当工作区充满数据后,缓冲区为空,时间为M,然后工作区开始处理数据,缓冲区1继续冲入数据,因为此时只有一个IO设备,所以缓冲区2虽然为空,但不能冲入数据。当缓冲区1充满数据后,工作区的数据还未处理完毕,时间为T,当工作区数据处理完毕后,此时工作区为空,缓冲区1满,缓冲区2为空,达到下一个初始状态,用时C+M。
图5.6双缓冲工作示意图

我们再来分析T>C+M的情况。缓冲区2开始向工作区传送数据,缓冲区1开始冲入数据,当工作区充满数据并处理完后,用时C+M,但缓冲区1的数据还未充满;当时间为T时,缓冲区1的数据充满,到达下一个初始状态。
总结:双缓冲区处理一块数据的用时为max(C+ M, T)。
若M+C< T,则可使块设备连续输入;若C+ M > T,则可使CPU不必等待设备输入。对于字符设备,若采用行输入方式,则采用双缓冲可使用户在输入第一行后,在CPU执行第一行中的命令的同时,用户可继续向第二缓冲区输入下一行数据。而单缓冲情况下则必须等待一行数据被提取完毕才可输入下一行的数据。
若两台机器之间通信仅配置了单缓冲,如图5.7(a)所示,则它们在任意时刻都只能实现单方向的数据传输。例如,只允许把数据从A机传送到B机,或从B机传送到A机,而绝不允许双方同时向对方发送数据。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收缓冲区,如图5.7(b)所示。
图5.7 双机通信时缓冲区的设置

3) $\color{green}{\text{循环缓冲}}$ 。包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。
循环缓冲用于输入/输出时,还需要有两个指针in和 out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据,out指针指向可以提取数据的第一个满缓冲区。输出则正好相反。
4) $\color{green}{\text{缓冲池}}$ 。由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)。
还应具有4种缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、用于收容输出数据的工作缓冲区及用于提取输出数据的工作缓冲区,如图5.8所示。
图5.8缓冲池的工作方式

当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区,然后把输入数据输入其中,装满后再将它挂到输入队列队尾。当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾。当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出工作缓冲区,当其中装满输出数据后,再将它挂到输出队列队尾。当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出工作缓冲区,当数据提取完后,再将它挂到空缓冲队列的队尾。
对于循环缓冲和缓冲池,我们只是定性地介绍它们的机理,而不去定量研究它们平均处理一块数据所需要的时间。而对于单缓冲和双缓冲,我们只要按照上面的模板分析,就可以解决任何计算单缓冲和双缓冲情况下数据块处理时间的问题,以不变应万变。
高速缓存与缓冲区的对比
高速缓存是可以保存数据拷贝的高速存储器,访问高速缓存比访问原始数据更高效,速度更快。高速缓存和缓冲区的对比见表5.1。
表5.1 高速缓存和缓冲区的对比

设备分配与回收
设备分配概述
设备分配是指根据用户的IO请求分配所需的设备。分配的总原则是充分发挥设备的使用效率,尽可能地让设备忙碌,又要避免由于不合理的分配方法造成进程死锁。从设备的特性来看,采用下述三种使用方式的设备分别称为独占设备、共享设备和虚拟设备。
1) $\color{green}{\text{独占式使用设备}}$ 。指在申请设备时,若设备空闲,则将其独占,不再允许其他进程申请使用,一直等到该设备被释放才允许其他进程申请使用。例如,打印机,在使用它打印时,只能独占式使用,否则在同一张纸上交替打印不同任务的内容,无法正常阅读。
2) $\color{green}{\text{分时式共享使用设备}}$ 。独占式使用设备时,设备利用率很低,当设备没有独占使用的要求时,可以通过分时共享使用提高利用率。例如,对磁盘设备的IO操作,各进程的每次I/O操作请求可以通过分时来交替进行。
3) $\color{green}{\text{以SPOOLing方式使用外部设备}}$ 。SPOOLing (Simultaneous Peripheral Operation On-Line)技术是在批处理操作系统时代引入的,即假脱机I/O技术。这种技术用于对设备的操作,实质上就是对IO操作进行批处理。SPOOLing 技术实质上是一种以空间换时间的技术,而我们熟悉的请求分页系统中的页面调度算法就刚好相反,是以时间换空间的技术。
设备分配的数据结构
设备分配依据的主要数据结构有设备控制表(DCT)、控制器控制表(COCT)、通道控制表(CHCT)和系统设备表(SDT),各数据结构功能如下。
设备控制表(DCT):我们可以认为,一个设备控制表就表征一个设备,而这个控制表中的表项就是设备的各个属性,如图5.9所示。
图5.9设备控制表

前面我们学过4种IO控制方式,通道方式显然要比其他几种方式更加优越,因此现代操作系统的I/O控制采用的都是通道控制。设备控制器控制设备与内存交换数据,而设备控制器又需要请求通道为它服务,因此每个COCT[见图5.10(a) ]必定有一个表项存放指向相应通道控制表(CHCT)[见图5.10(b) ]的指针,而一个通道可为多个设备控制器服务,因此CHCT中必定有一个指针,指向一个表,这个表上的信息表达的是CHCT提供服务的那几个设备控制器。CHCT 与COCT的关系是 $\color{green}{\text{一对多}}$ 的关系。
系统设备表(SDT):整个系统只有一张 SDT,如图5.10(c)所示。它记录已连接到系统中的所有 $\color{green}{\text{物理设备的情况}}$ ,每个物理设备占一个表目。
图5.10COCT、CHCT 和 SDT

由于在多道程序系统中,进程数多于资源数,会引起资源的竞争,因此要有一套合理的分配原则,主要考虑的因素有:I/O设备的固有属性、I/O设备的分配算法、I/O设备分配的安全性以及IO设备的独立性。
设备分配的策略
1)设备分配原则。设备分配应根据设备特性、用户要求和系统配置情况。分配的总原则是:既要充分发挥设备的使用效率,又要避免造成进程死锁,还要将用户程序和具体设备隔离开。
2)设备分配方式。设备分配方式有静态分配和动态分配两种。
$\color{green}{\text{静态分配}}$ 主要用于对独占设备的分配,它在用户作业开始执行前,由系统一次性分配该作业所要求的全部设备、控制器(如通道等)。一旦分配,这些设备、控制器(和通道)就一直为该作业所占用,直到该作业被撤销。静态分配方式不会出现死锁,但设备的使用效率低。因此,静态分配方式并不符合分配的总原则。
$\color{green}{\text{动态分配}}$ 在进程执行过程中根据执行需要进行。当进程需要设备时,通过系统调用命令向系统提出设备请求,由系统按照事先规定的策略给进程分配所需要的设备、IO控制器,一旦用完,便立即释放。动态分配方式有利于提高设备的利用率,但若分配算法使用不当,则有可能造成进程死锁。
3)设备分配算法。常用的动态设备分配算法有先请求先分配、优先级高者优先等。
对于独占设备,既可以采用动态分配方式,又可以采用静态分配方式,但往往采用静态分配方式,即在作业执行前,将作业所要用的这一类设备分配给它。共享设备可被多个进程所共享,一般采用动态分配方式,但在每个IO传输的单位时间内只被一个进程所占有,通常采用先请求先分配和优先级高者优先的分配算法。
设备分配的安全性
设备分配的安全性是指设备分配中应防止发生进程死锁。
1) $\color{green}{\text{安全分配方式}}$ 。每当进程发出IO请求后便进入阻塞态,直到其IO操作完成时才被唤醒。这样,一旦进程已经获得某种设备后便阻塞,不能再请求任何资源,而且在它阻塞时也不保持任何资源。优点是设备分配安全;缺点是CPU和IO设备是串行工作的(对同一进程而言)。
2) $\color{green}{\text{不安全分配方式}}$ 。进程在发出I/O请求后继续运行,需要时又发出第二个、第三个I/O请求等。仅当进程所请求的设备已被另一进程占用时,才进入阻塞态。优点是一个进程可同时操作多个设备,从而迅速推进进程;缺点是这种设备分配有可能产生 $\color{green}{\text{死锁}}$ 。
逻辑设备名到物理设备名的映射
为了提高设备分配的灵活性和设备的利用率,方便实现IO重定向,引入了设备独立性。设备独立性是指应用程序独立于具体使用的物理设备。
为了实现设备独立性,在应用程序中使用逻辑设备名来请求使用某类设备,在系统中设置一张 $\color{green}{\text{逻辑设备表}}$ (Logical Unit Table,LUT),用于将逻辑设备名映射为物理设备名。LUT表项包括逻辑设备名、物理设备名和设备驱动程序入口地址;当进程用逻辑设备名来请求分配设备时,系统为它分配相应的物理设备,并在LUT中建立一个表项,以后进程再利用逻辑设备名请求I/O操作时,系统通过查找LUT来寻找相应的物理设备和驱动程序。
在系统中可采取两种方式建立逻辑设备表:
1)在整个系统中只设置一张 LUT。这样,所有进程的设备分配情况都记录在这张表中,因此不允许有相同的逻辑设备名,主要适用于单用户系统。
2)为每个用户设置一张 LUT。当用户登录时,系统便为该用户建立一个进程,同时也为之建立一张LUT,并把该表放入进程的PCB。
SPOOLing技术(假脱机技术)
为了缓和 CPU的高速性与I/O设备低速性之间的矛盾,引入了脱机输入/输出技术。该技术利用专门的外围控制机,将低速IO设备上的数据传送到高速磁盘上,或者相反。SPOOLing 的意思是外部设备同时联机操作,又称假脱机输入/输出操作,是操作系统中采用的一项将独占设备改造成共享设备的技术。
SPOOLing系统的组成如图5.11所示。
图5.11SPOOLing系统的组成

输入井和输出井
输入井和输出井是指在磁盘上开辟出的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容IO设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
输入缓冲区和输出缓冲区
输入缓冲区和输出缓冲区是在内存中开辟的两个缓冲区。输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,以后再传送到输出设备。
输入进程和输出进程
输入进程模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井。当CPU需要输入数据时,直接将数据从输入井读入内存。输出进程模拟脱机输出时的外围控制机,把用户要求输出的数据先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备。
共享打印机是使用SPOOLing 技术的一个实例,这项技术已被广泛地用于多用户系统和局域网络。当用户进程请求打印输出时,SPOOLing 系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:
1)由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。
2)输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。
SPOOLing系统的主要特点有:提高了IO 的速度;将独占设备改造为共享设备﹔实现了虚拟设备功能。
前面我们提到过SPOOLing技术是一种以空间换时间的技术,我们很容易理解它牺牲了空间,因为它开辟了磁盘上的空间作为输入井和输出井,但它又如何节省时间呢?
从前述内容我们了解到,磁盘是一种高速设备,在与内存交换数据的速度上优于打印机、键盘、鼠标等中低速设备。试想一下,若没有SPOOLing 技术,CPU要向打印机输出要打印的数据,打印机的打印速度比较慢,CPU就必须迁就打印机,在打印机把数据打印完后才能继续做其他的工作,浪费了CPU的不少时间。在SPOOLing 技术下,CPU要打印机打印的数据可以先输出到磁盘的输出井中(这个过程由输出进程控制),然后做其他的事情。若打印机此时被占用,则SPOOLing 系统就会把这个打印请求挂到等待队列上,待打印机有空时再把数据打印出来。向磁盘输出数据的速度比向打印机输出数据的速度快,因此就节省了时间。
本节小结
本节开头提出的问题的参考答案如下。
当处理机和外部设备速度差距较大时,并且此时不想让其中一方等待,有什么办法可以解决问题?
可以采用缓冲技术来缓解处理机与外部设备速度上的矛盾,即在某块地方(一般为主存)设立一片缓冲区,外部设备与处理机的输入/输出都经过缓冲区,这样外部设备和处理机就都不用互相等待。
什么是设备的独立性?引入设备的独立性有什么好处?
设备独立性是指用户在编程序时使用的设备与实际设备无关。一个程序应独立于分配给它的某类设备的具体设备,即在用户程序中只指明IO使用的设备类型即可。
设备独立性有以下优点:
${\textstyle\unicode{x2460}}$ 方便用户编程。
${\textstyle\unicode{x2461}}$ 使程序运行不受具体机器环境的限制。
${\textstyle\unicode{x2462}}$ 便于程序移植。
王道-操作系统-ch4-文件管理
王道
文件管理
【考纲内容】
(一)文件系统基础
- 文件的概念
- 文件的逻辑结构: $\color{red}{\text{文件元数据}}$ 和索引节点(inode)
- 文件的操作(建立,删除,打开,关闭,读,写)
- 文件的保护
- 文件的逻辑结构
- 文件的物理结构
(二)目录
- 目录的基本概念
- 树形目录
- $\color{red}{\text{目录的操作}}$
- 硬链接和软链接
(二)文件系统
- $\color{red}{\text{文件系统的全局结构}}$ (layout)(文件系统在外存中的结构,文件系统在内存中的结构)
- 外存空闲空间管理办法
- $\color{red}{\text{虚拟文件系统}}$
- $\color{red}{\text{文件系统挂载}}$ (mounting)
- 概念——定义、属性、基本操作、打开与关闭
- 文件逻辑结构
- 无结果文件(流式文件)
- 有结构文件(记录式文件)
- 顺序文件
- 索引文件
- 索引顺序文件
- 目录结构
- 文件控制块(FCB)、索引结点
- 单级目录结构、两级目录结构、树形目录结构、图形目录结构
- 文件共享
- 基于索引结点(硬链接)
- 利用符号链实现(软链接)
- 文件保护————访问类型、访问控制
- 实现
- 层次结构
- 目录实现————线性列表、哈希表
- 文件分配
- 连续分配
- 链接分配
- 索引分配————索引链接、多层索引、混合索引
- 文件存储空间管理
- 空闲表法
- 空闲链表法
- 位示图法成组链接法
- 磁盘
- 访问时间——寻道时间、延迟时间、传输时间
- 调度算法
- 先来先服务(FCFS)————公平
- 最短寻找时间优先(SSTF)————“饥饿”现象
- 扫描算法(SCAN)
- 循环扫描(C-SCAN)
- 磁盘的管理————初始化、引导块、坏块
【复习提示】
本章内容较为具体,要注意对概念的理解。重点掌握文件系统的结构及其实现、磁盘的相关知识点等。要掌握文件系统的文件控制块、物理分配方法、索引结构,以及磁盘特性和结构、磁盘调度算法,能分析磁盘相关的性能等。这些都是综合题易考查的内容。
文件系统基础
在学习本节时,请读者思考以下问题:
1)什么是文件?什么是文件系统?
2)文件系统要完成哪些功能?
本节内容较为抽象,对于初学者,推荐配合相关教材的相关章节进行学习。学习过程中要注意区分文件的逻辑结构和物理结构,不要把二者混为一谈。在读者的学习过程中,可尝试以上面的两个问题为线索,构建整个文件系统的概念,先思考有什么方法可以实现文件的共享和保护,再将自己的方法与书上的方法相比较。
在前面的学习中,曾经提醒过读者不要忽略对基本概念的理解。操作系统这门课程在统考中算是比较容易得分的一门课程,从历年的情况来看,大部分同学对进程管理、内存管理有较好的掌握,但对于文件管理及下一章的IO管理,往往理解不太深入,记忆不太牢固,在考试中,即使面对一些关于本章内容的基本问题也容易失分,这十分可惜。主要原因还是对概念的理解不够全面和透彻,希望各位读者能够关注这个问题。
文件的概念
文件的定义
文件(File)是操作系统中的一个重要概念。文件是以计算机硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片、程序等。在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。大多数应用程序的输入都是通过文件来实现的,其输出也都保存在文件中,以便信息的长期存储及将来的访问。当用户将文件用于应用程序的输入、输出时,还希望可以访问文件、修改文件和保存文件等,实现对文件的维护管理,这就需要系统提供一个文件管理系统,操作系统中的 $\color{green}{\text{文件系统}}$ (File System)就是用于实现用户的这些管理要求的。
要清晰地理解文件的概念,就要了解文件究竟由哪些东西组成。
首先,文件中肯定包括一块存储空间,更准确地说,是存储空间中的数据;其次,由于操作系统要管理成千上万的数据,因此必定需要对这些数据进行划分,然后贴上“标签”,以便于分类和索引,所以文件必定包含分类和索引的信息;最后,不同的用户拥有对数据的不同访问权限,因此文件中一定包含一些关于访问权限的信息。
再举生活中的一个直观例子来类比文件,相信读者了解这个例子后会更深入地了解文件。这个例子就是图书馆中的书,可以认为,计算机中的一个文件相当于图书馆中的一本书,操作系统管理文件,相当于图书管理员管理图书馆中的书。
首先,一本书的主体一定是书中的内容,相当于文件中的数据;其次,不同类别的书需要放在不同的书库,然后加上编号,再把编号登记在图书管理系统中,方便读者查阅,相当于文件的分类和查找;最后,有些已经绝版或价格比较高的外文书籍,只能借给VIP会员或权限比较高的其他读者,而有些普通的书籍可供任何人借阅,这就是文件中的访问权限。
所举的例子与实际操作系统中的情形并不绝对等价,读者应能找出类比中的不严谨之处,但对于某些关键的属性,图书馆管理图书和操作系统管理文件的思想却有相一致的地方,因此通过这种类比可使初学者快速认识陌生的概念。
从用户的角度看,文件系统是操作系统的重要部分之一。用户关心的是如何命名、分类和查找文件,如何保证文件数据的安全性及对文件可以进行哪些操作等。而对其中的细节,如文件如何存储在辅存上、如何管理文件辅存区域等关心甚少。
文件系统提供了与二级存储相关的资源的抽象,让用户能在不了解文件的各种属性、文件存储介质的特征及文件在存储介质上的具体位置等情况下,方便快捷地使用文件。
用户通过文件系统建立文件,提供应用程序的输入、输出,对资源进行管理。首先了解文件的结构,我们通过自底向上的方式来定义。
1)数据项。数据项是文件系统中最低级的数据组织形式,可分为以下两种类型:
- 基本数据项。用于描述一个对象的某种属性的一个值,如姓名、日期或证件号等,是数据中可命名的最小逻辑数据单位,即原子数据。
- 组合数据项。由多个基本数据项组成。
2)记录。记录是一组相关的数据项的集合,用于描述一个对象在某方面的属性,如一名考生的报名记录包括考生姓名、出生日期、报考学校代号、身份证号等一系列域。
3)文件。文件是指由创建者所定义的一组相关信息的集合,逻辑上可分为有结构文件和无结构文件两种。在有结构文件中,文件由一组相似的记录组成,如报考某学校的所有考生的报考信息记录,又称记录式文件;而无结构文件则被视为一个字符流,比如一个二进制文件或字符文件,又称流式文件。
虽然上面给出了结构化的表还,但头协上NJ大#制代码,其基太访问单元可以是字节、行或程序和数据组织成文件。文件可以定效丁、于出m中允许可控制的进程间共享访问,能够被组记录。文件可以长期存储于硬盘或其他二级存储器中,允许可控制的进程间共享访问,能够被组织成复杂的结构。
文件的属性
文件具有一定的属性,系统不同,属性也会有所不同,但通常都包括如下属性。
1) $\color{green}{\text{名称}}$ 。文件名称唯一,以容易读取的形式保存。
2) $\color{green}{\text{标识符}}$ 。标识文件系统内文件的唯一标签,通常为数字,是对人不可读的一种内部名称。
3) $\color{green}{\text{类型}}$ 。被支持不同类型的文件系统所使用。
4) $\color{green}{\text{位置}}$ 。指向设备和设备上文件的指针。
5) $\color{green}{\text{大小}}$ 。文件当前大小(用字节、字或块表示),也可包含文件允许的最大值。
6) $\color{green}{\text{保护}}$ 。对文件进行保护的访问控制信息。
7) $\color{green}{\text{时间、日期和用户标识}}$ 。文件创建、上次修改和上次访问的相关信息,用于保护和跟踪文件的使用。
所有文件的信息都保存在目录结构中,而目录结构保存在外存上。文件信息在需要时才调入内存。通常,目录条目包括文件名称及其唯一的标识符,而标识符定位其他属性的信息。
文件的基本操作
文件属于抽象数据类型。为了恰当地定义文件,需要考虑有关文件的操作。操作系统提供系统调用,它对文件进行创建、写、读、重定位、删除和截断等操作。
1) $\color{green}{\text{创建文件}}$ 。创建文件有两个必要步骤:一是在文件系统中为文件找到空间;二是在目录中为新文件创建条目,该条目记录文件名称、在文件系统中的位置及其他可能的信息。
2) $\color{green}{\text{写文件}}$ 。为了写文件,执行一个系统调用,指明文件名称和要写入文件的内容。对于给定文件名称,系统搜索目录以查找文件位置。系统必须为该文件维护一个写位置的指针。每当发生写操作时,便更新写指针。
3) $\color{green}{\text{读文件}}$ 。为了读文件,执行一个系统调用,指明文件名称和要读入文件块的内存位置。同样,需要搜索目录以找到相关目录项,系统维护一个读位置的指针。每当发生读操作时,更新读指针。一个进程通常只对一个文件读或写,因此当前操作位置可作为每个进程当前文件位置的指针。由于读和写操作都使用同一指针,因此节省了空间,也降低了系统复杂度。
4) $\color{green}{\text{文件重定位}}$ (文件寻址)。按某条件搜索目录,将当前文件位置设为给定值,并且不会读、写文件。
5) $\color{green}{\text{删除文件}}$ 。先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。
6) $\color{green}{\text{截断文件}}$ 。允许文件所有属性不变,并删除文件内容,即将其长度设为0并释放其空间。这6个基本操作可以组合起来执行其他文件操作。例如,一个文件的复制,可以创建新文件、从旧文件读出并写入新文件。
这6个基本操作可以组合起来执行其他文件操作。例如,一个文件的复制,可以创建新文件、从旧文件读出并写入新文件。
文件的打开与关闭
因为许多文件操作都涉及为给定文件搜索相关目录条目,因此许多系统要求在首次使用文件时,使用系统调用open将指明文件的 $\color{green}{\text{属性}}$ (包括该文件在外存上的物理位置)从外存 $\color{green}{\text{复制}}$ 到内存打开文件表的一个表目中,并将该表目的编号(也称索引)返回给用户。操作系统维护一个包含所有打开文件信息的表(打开文件表,open-file table)。当用户需要一个文件操作时,可通过该表的一个索引指定文件,因此省略了搜索环节。当文件不再使用时,进程可以关闭它,操作系统从打开文件表中删除这一条目。
大部分操作系统要求在文件使用之前就被显式地打开。操作 open 会根据文件名搜索目录,并将目录条目复制到打开文件表。若调用open 的请求(创建、只读、读写、添加等)得到允许,则进程就可打开文件,而 open通常返回一个指向打开文件表中的一个条目的指针。通过使用该指针(而非文件名)进行所有IO操作,以简化步骤并节省资源。
注意,在open调用完成后,操作系统对该文件的任何操作都不再需要文件名,而只需要open调用返回的指针。
整个系统表包含进程相关信息,如文件在磁盘的位置、访问日期和大小。一个进程打开一个文件,系统打开文件表就会为打开的文件增加相应的条目。当另一个进程执行open时,只不过是在其进程打开表中增加一个条目,并指向整个系统表的相应条目。通常,系统打开文件表的每个文件时,还用一个文件打开计数器(Open Count),以记录多少进程打开了该文件。每个关闭操作close使count递减,当打开计数器为0时,表示该文件不再被使用,系统将回收分配给该文件的内存空间等资源。若文件被修改过,则将文件写回外存,并将系统打开文件表中的相应条目删除,最后释放文件的文件控制块(File Control Block,FCB)。
每个打开文件都有如下关联信息:
- 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
- 文件打开计数。文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间会不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。计数器跟踪打开和关闭的数量,计数为0时,系统关闭文件,删除该条目。
- 文件磁盘位置。绝大多数文件操作都要求系统修改文件数据。该信息保存在内存中,以免为每个操作都从磁盘中读取。
- 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝之后的I/O请求。
文件的逻辑结构
文件的逻辑结构是从用户观点出发看到的文件的组织形式。文件的物理结构(又称文件的存储结构,见4.2.1节)是从实现观点出发看到的文件在外存上的存储组织形式。文件的逻辑结构与存储介质特性无关,但文件的物理结构与存储介质的特性有很大关系。文件的逻辑结构实际上是指在文件的内部,数据逻辑上是如何组织起来的。
按逻辑结构,文件可划分为无结构文件和有结构文件两种。
无结构文件(流式文件)
无结构文件是最简单的文件组织形式。无结构文件将数据按顺序组织成记录并积累、保存,它是有序相关信息项的集合,以字节(Byte)为单位。由于无结构文件没有结构,因而对记录的访问只能通过穷举搜索的方式,因此这种文件形式对大多数应用不适用。但字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于采用字符流的无结构方式,如源程序文件、目标代码文件等。
有结构文件(记录式文件)
有结构文件按记录的组织形式可以分为如下几种:
1)顺序文件。文件中的记录一个接一个地顺序排列,记录通常是定长的,可以顺序存储或以链表形式存储,在访问时需要顺序搜索文件。顺序文件有以下两种结构:第一种是串结构,记录之间的顺序与关键字无关。通常的办法是由时间决定,即按存入时间的先后排列,最先存入的记录作为第1条记录,其次存入的为第2条记录,以此类推。第二种是顺序结构,指文件中的所有记录按关键字顺序排列。
在对记录进行批量操作,即每次要读或写一大批记录时,顺序文件的效率是所有逻辑文件中最高的;此外,也只有顺序文件才能存储在磁带上,并能有效地工作,但顺序文件对查找、修改、增加或删除单条记录的操作比较困难。
2)索引文件。索引文件示意图如图4.1所示。对于定长记录文件,要查找第i条记录,可直接根据下式计算得到第i条记录相对于第1条记录的地址:
$$
A_i= i×L
$$
然而,对于可变长记录的文件,要查找第i条记录,必须顺序地查找前 $i$ –1条记录,从而获得相应记录的长度L,进而按下式计算出第 $i$ 条记录的首址:
$$
A_i = \sum_{i=0}^{i-1} L_i + 1
$$
注意:假定每条记录前用一个字节指明该记录的长度。
变长记录文件只能顺序查找,系统开销较大。为此,可以建立一张索引表以加快检索速度,索引表本身是定长记录的顺序文件。在记录很多或访问要求高的文件中,需要引入索引以提供有效的访问。实际中,通过索引可以成百上千倍地提高访问速度。
图4.1索引文件示意图

3)索引顺序文件。索引顺序文件是顺序和索引两种组织形式的结合。索引顺序文件将顺序文件中的所有记录分为若干组,为顺序文件建立一张索引表,在索引表中为每组中的第一条记录建立一个索引项,其中含有该记录的关键字值和指向该记录的指针。
如图4.2所示,主文件名包含姓名和其他数据项。姓名为关键字,索引表中为每组的第一条记录(不是每条记录)的关键字值,用指针指向主文件中该记录的起始位置。索引表只包含关键字和指针两个数据项,所有姓名关键字递增排列。主文件中记录分组排列,同一个组中的关键字可以无序,但组与组之间的关键字必须有序。查找一条记录时,首先通过索引表找到其所在的组,然后在该组中使用顺序查找,就能很快地找到记录。
图4.2索引顺序文件示意图

对于含有N条记录的顺序文件,查找某关键字值的记录时,平均需要查找N/2次。在索引顺序文件中,假设N条记录分为 $\sqrt{N}$ 组,索引表中有$\sqrt{N}$个表项,每组有$\sqrt{N}$条记录,在查找某关键字值的记录时,先顺序查找索引表,需要查找√N/2次,然后在主文件中对应的组中顺序查找,也需要查找$\sqrt{N}$/2次,因此共需查找$\sqrt{N}$ /2+$\sqrt{N}$ /2=$\sqrt{N}$ 次。显然,索引顺序文件提高了查找效率,若记录数很多,则可采用两级或多级索引。
索引文件和索引顺序文件都提高了存取的速度,但因为配置索引表而增加了存储空间。
4)直接文件或散列文件(Hash File)。给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。这种映射结构不同于顺序文件或索引文件,没有顺序的特性。
散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
复习了数据结构的读者读到这里时,会有这样的感觉:有结构文件逻辑上的组织,是为在文件中查找数据服务的(顺序查找、索引查找、索引顺序查找、哈希查找)。
目录结构
与文件管理系统和文件集合相关联的是文件目录,它包含有关文件的信息如属性、位置和所有权等,这些信息主要由操作系统进行管理。首先我们来看目录管理的基本要求:从用户的角度看,目录在用户(应用程序)所需要的文件名和文件之间提供一种映射,所以目录管理要实现“按名存取”;目录存取的效率直接影响到系统的性能,所以要提高对目录的检索速度;在共享系统中,目录还需要提供用于控制访问文件的信息。此外,文件允许重名也是用户的合理和必然要求,目录管理通过树形结构来解决和实现。
前面介绍了文件内部的逻辑结构,下面介绍多个文件之间在逻辑上是如何组织的,这实际上是文件“外部”的逻辑结构的问题。
文件控制块和索引结点
与进程管理一样,为实现目录管理,操作系统中引入了文件控制块的数据结构。
1)文件控制块。文件控制块(FCB)是用来存放控制文件需要的各种信息的数据结构以实现“按名存取”。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项为了创建一个新文件,系统将分配一个FCB并存放在文件目录中,成为目录项。
FCB主要包含以下信息:
- 基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
- 存取控制信息,如文件存取权限等。
- 使用信息,如文件建立时间、修改时间等。
2)索引结点。在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项(查找文件名与目录项中文件名匹配)时,才需要从该目录项中读出该文件的物理地址。也就是说,在检索目录时,文件的其他描述信息不会用到,也不需要调入内存。因此,有的系统(如UNIX,见表4.1)采用了文件名和文件描述信息分开的方法,文件描述信息单独形成一个称为索引结点的数据结构,简称i结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针构成。
表4.1UNIX的文件目录结构

一个FCB的大小是64B,盘块大小是1KB,因此在每个盘块中可以存放16个FCB(注意,FCB必须连续存放)。而在 UNIX系统中,一个目录项仅占16B,其中14B是文件名,2B是i结点指针。在1KB的盘块中可存放64个目录项。这样,就可使查找文件时的平均启动磁盘次数减少到原来的1/4,大大节省了系统开销。
存放在磁盘上的索引结点称为磁盘索引结点,UNIX中的每个文件都有一个唯一的磁盘索引结点,主要包括以下几个方面:
- $\color{green}{\text{文件主标识符}}$ ,拥有该文件的个人或小组的标识符。
- $\color{green}{\text{文件类型}}$ ,包括普通文件、目录文件或特别文件。文件存取权限,各类用户对该文件的存取权限。
- $\color{green}{\text{文件物理地址}}$ ,每个索引结点中含有13个地址项,即 iaddr(O)一iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号。
- $\color{green}{\text{文件长度}}$ ,以字节为单位。
- $\color{green}{\text{文件链接计数}}$ ,在本文件系统中所有指向该文件的文件名的指针计数。
- $\color{green}{\text{文件存取时间}}$ ,本文件最近被进程存取的时间、最近被修改的时间及索引结点最近被修改的时间。
文件被打开时,磁盘索引结点复制到内存的索引结点中,以便于使用。在内存索引结点中又增加了以下内容:
- 索引结点编号,用于标识内存索引结点。
- 状态,指示i结点是否上锁或被修改。
- 访问计数,每当有一进程要访问此i结点时,计数加1,访问结束减1。
- 逻辑设备号,文件所属文件系统的逻辑设备号。
- 链接指针,设置分别指向空闲链表和散列队列的指针。
FCB或索引结点相当于图书馆中图书的索书号,我们可以在图书馆网站上找到图书的索书号,然后根据索书号找到想要的书本。
目录结构
在理解一个文件系统的需求前,我们首先考虑在目录这个层次上所需要执行的操作,这有助于后面文件系统的整体理解。
- 搜索。当用户使用一个文件时,需要搜索目录,以找到该文件的对应目录项。
- 创建文件。当创建一个新文件时,需要在目录中增加-个目录项。
- 删除文件。当删除一个文件时,需要在目录中删除相应的目录项。
- 显示目录。用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。
- 修改目录。某些文件属性保存在目录中,因而这些属性的变化需要改变相应的目录项。操作时,考虑以下几种目录结构:
操作时,考虑以下几种目录结构:
1)$\color{green}{\text{单级目录结构}}$ 。在整个文件系统中只建立一张目录表,每个文件占一个目录项,如图4.3所示。
图4.3单级目录结构

当访问一个文件时,先按文件名在该目录中查找到相应的FCB,经合法性检查后执行相应的操作。当建立一个新文件时,必须先检索所有目录项以确保没有“重名”的情况,然后在该目录中增设一项,把FCB 的全部信息保存在该项中。当删除一个文件时,先从该目录中找到该文件的目录项,回收该文件所占用的存储空间,然后清除该目录项。
单级目录结构实现了“按名存取”,但是存在查找速度慢、文件不允许重名、不便于文件共享等缺点,而且对于多用户的操作系统显然是不适用的。
2)两级目录结构。单级目录很容易造成文件名称的混淆,因此可以考虑采用两级方案,将文件目录分成主文件目录(Master File Directory,MFD)和用户文件目录(User FileDirectory, UFD)两级,如图4.4所示。
主文件目录项记录用户名及相应用户文件目录所在的存储位置。用户文件目录项记录该用户文件的FCB 信息。当某用户欲对其文件进行访问时,只需搜索该用户对应的UFD,这既解决了不同用户文件的“重名”问题,又在一定程度上保证了文件的安全。
两级目录结构可以解决多用户之间的文件重名问题,文件系统可以在目录上实现访问限制。但是两级目录结构缺乏灵活性,不能对文件分类。
图4.4两级目录结构

3)多级目录结构(树形目录结构)。将两级目录结构的层次关系加以推广,就形成了多级目录结构,即树形目录结构,如图4.5所示。
用户要访问某个文件时,用文件的路径名标识文件,文件路径名是个字符串,由从根目录出发到所找文件通路上所有目录名与数据文件名用分隔符“/”链接而成。从根目录出发的路径称为绝对路径。当层次较多时,每次从根目录查询会浪费时间,于是加入了当前目录(又称工作目录),进程对各文件的访问都是相对于当前目录进行的。当用户要访问某个文件时,使用相对路径标识文件,相对路径由从当前目录出发到所找文件通路上所有目录名与数据文件名用分隔符“/”链接而成。
图4.5树形目录结构

图4.5是Linux 操作系统的目录结构,”/dev/hda”就是一个绝对路径。若当前目录为“/bin”,则“./1s”就是一个相对路径,其中符号“.”表示当前工作目录。
通常,每个用户都有各自的“当前目录”,登录后自动进入该用户的“当前目录”。操作系统提供一条专门的系统调用,供用户随时改变“当前目录”。例如,在 UNIX系统中,”/etc/passwd”文件就包含有用户登录时默认的“当前目录”,可用cd命令改变“当前目录”。
树形目录结构可以很方便地对文件进行分类,层次结构清晰,也能够更有效地进行文件的管理和保护。但是,在树形目录中查找一个文件时,需要按路径名逐级访问中间结点,这就增加了磁盘访问次数,无疑将影响查询速度。
4)无环图目录结构。树形目录结构能便于实现文件分类,但不便于实现文件共享,为此在树形目录结构的基础上增加了一些指向同一结点的有向边,使整个目录成为一个有向无环图。引入无环图目录结构是为了实现文件共享,如图4.6所示。
图4.6无环图目录结构

当某用户要求删除一个共享结点时,若系统只是简单地将它删除,则当另一共享用户需要访问时,会因无法找到这个文件而发生错误。为此,可为每个共享结点设置一个共享计数器,每当图中增加对该结点的共享链时,计数器加1;每当某用户提出删除该结点时,计数器减1。仅当共享计数器为0时,才真正删除该结点,否则仅删除请求用户的共享链。共享文件(或目录)不同于文件拷贝(副本)。若有两个文件拷贝,则每个程序员看到的是拷贝而不是原件;然而,若一个文件被修改,则另一个程序员的拷贝不会改变。对于共享文件,只存在一个真正的文件,任何改变都会为其他用户所见。
无环图目录结构方便地实现了文件的共享,但使得系统的管理变得更加复杂。
文件共享
文件共享使多个用户(进程)共享同一个文件,系统中只需保留该文件的一个副本。若系统不能提供共享功能,则每个需要该文件的用户都要有各自的副本,会造成对存储空间的极大浪费。随着计算机技术的发展,文件共享的范围已由单机系统发展到多机系统,进而通过网络扩展到全球。这些文件的分享是通过分布式文件系统、远程文件系统、分布式信息系统实现的。这些系统允许多个客户通过C/S模型共享网络中的服务器文件。
现代常用的两种文件共享方法如下。
基于索引结点的共享方式(硬链接)
在树形结构的目录中,当有两个或多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个或多个用户的目录中,才能方便地找到该文件,如图4.7所示。
图4.7基于索引结点的共享方式

在这种共享方式中,诸如文件的物理地址及其他的文件属性等信息,不再放在目录项中,而放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针。在索引结点中还应有一个链接计数count,用于表示链接到本索引结点(即文件)上的用户目录项的数目。当count = 2时,表示有两个用户目录项链接到本文件上,或者说有两个用户共享此文件。
用户A创建一个新文件时,它便是该文件的所有者,此时将count置为1。用户B要共享此文件时,在用户B的目录中增加一个目录项,并设置一个指针指向该文件的索引结点。此时,文件主仍然是用户A,count=2。用户A不再需要此文件,不能将文件直接删除。因为若删除了该文件,则必然也删除了该文件的索引结点,这样便会使用户B的指针悬空,而用户B可能正在此文件上执行写操作,此时用户B会无法访问到文件。因此用户A不能删除此文件,只是将该文件的count减1,然后删除自己目录中的相应目录项。用户B仍可以使用该文件。当count =0时,表示没有用户使用该文件,系统将负责删除该文件。如图4.8给出了用户B链接到文件上的前、后情况。
图4.8文件共享中的链接计数

利用符号链实现文件共享(软链接)
为使用户B能共享用户A的一个文件F,可以由系统创建一个LINK类型的新文件也取名为F,并将文件F写入用户B的目录中,以实现用户B的目录与文件F的链接。在新文件中只包含被链接文件F的路径名。这样的链接方法被称为符号链接。
新文件中的路径名只被视为符号链,当用户B要访问被链接的文件F且正要读LINK类新文件时,操作系统根据新文件中的路径名去读该文件,从而实现用户B对文件F的共享。
在利用符号链方式实现文件共享时,只有文件的拥有者才拥有指向其索引结点的指针而共享该文件的其他用户只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一个共享文件后留下一个悬空指针的情况。当文件的拥有者把一个共享文件删除后,其他用户通过符号链去访问它时,会出现访问失败,于是将符号链删除,此时不会产生任何影响。当然,利用符号链实现文件共享仍然存在问题。例如,一个文件采用符号链方式共享,当文件拥有者将其删除,而在共享的其他用户使用其符号链接访问该文件之前,又有人在同一路径下创建了另一个具有同样名称的文件,则该符号链将仍然有效,但访问的文件已经改变,从而导致错误。
在符号链的共享方式中,当其他用户读共享文件时,需要根据文件路径名逐个地查找目录,直至找到该文件的索引结点。因此,每次访问时,都可能要多次地读盘,使得访问文件的开销变大并增加了启动磁盘的频率。此外,符号链的索引结点也要耗费一定的磁盘空间。
符号链方式有一个很大的优点,即网络共享只需提供该文件所在机器的网络地址及该机器中的文件路径。
上述两种链接方式都存在一个共同的问题,即每个共享文件都有几个文件名。换言之,每增加一条链接,就增加一个文件名。这实质上是每个用户都使用自己的路径名去访问共享文件。当我们试图去遍历整个文件系统时,将会多次遍历到该共享文件。
硬链接和软链接都是文件系统中的静态共享方法,在文件系统中还存在着另外的共享需求,即两个进程同时对同一个文件进行操作,这样的共享称为 $\color{green}{\text{动态共享}}$ 。
可以这样说:文件共享,“软”“硬”兼施。硬链接就是多个指针指向一个索引结点,保证只要还有一个指针指向索引结点,索引结点就不能删除;软链接就是把到达共享文件的路径记录下来,当要访问文件时,根据路径寻找文件。可以想象,硬链接的查找速度要比软链接的快。
文件保护
为了防止文件共享可能会导致文件被破坏或未经核准的用户修改文件,文件系统必须控制用户对文件的存取,即解决对文件的读、写、执行的许可问题。为此,必须在文件系统中建立相应的文件保护机制。
文件保护通过 $\color{green}{\text{口令保护}}$ 、 $\color{green}{\text{加密保护}}$ 和 $\color{green}{\text{访问控制}}$ 等方式实现。其中,口令保护和加密保护是为了防止用户文件被他人存取或窃取,而访问控制则用于控制用户对文件的访问方式。
访问类型
对文件的保护可从限制对文件的访问类型中出发。可加以控制的访问类型主要有以下几种。
- 读。从文件中读。
- 写。向文件中写。
- 执行。将文件装入内存并执行。
- 添加。将新信息添加到文件结尾部分。
- 删除。删除文件,释放空间。
- 列表清单。列出文件名和文件属性。
此外还可以对文件的重命名、复制、编辑等加以控制。这些高层的功能可以通过系统程序调用低层系统调用来实现。保护可以只在低层提供。例如,复制文件可利用一系列的读请求来完成,这样,具有读访问权限的用户同时也就具有了复制和打印权限。
访问控制
解决访问控制最常用的方法是根据用户身份进行控制。而实现基于身份访问的最为普通的方法是,为每个文件和目录增加一个 $\color{green}{\text{访问控制列表}}$ (Access-Control List,ACL),以规定每个用户名及其所允许的访问类型。
这种方法的优点是可以使用复杂的访问方法,缺点是长度无法预计并且可能导致复杂的空间管理,使用精简的访问列表可以解决这个问题。
精简的访问列表采用拥有者、组和其他三种用户类型。
1)拥有者。创建文件的用户。
2)组。一组需要共享文件且具有类似访问的用户。
3)其他。系统内的所有其他用户。这样,只需用三个域即可列出访问表中这三类用户的访问权限。文件拥有者在创建文件时,说明创建者用户名及所在的组名,系统在创建文件时也将文件主的名字、所属组名列在该文件的FCB中。用户访问该文件时,按照拥有者所拥有的权限访问文件,若用户和拥有者在同一个用户组,则按照同组权限访问,否则只能按其他用户权限访问。UNIX操作系统即采用此种方法。
口令和密码是另外两种访问控制方法。
口令指用户在建立一个文件时提供一个口令,系统为其建立FCB 时附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应的口令。这种方法时间和空间的开销不多,缺点是口令直接存在系统内部,不够安全。
密码指用户对文件进行加密,文件被访问时需要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定的时间。
口令和密码都是防止用户文件被他人存取或窃取,并没有控制用户对文件的访问类型。注意两个问题:
1)现代操作系统常用的文件保护方法是,将访问控制列表与用户、组和其他成员访问控制方案一起组合使用。
2)对于多级目录结构而言,不仅需要保护单个文件,而且需要保护子目录内的文件,即需要提供目录保护机制。目录操作与文件操作并不相同,因此需要不同的保护机制。
本节小结
本节开头提出的问题的参考答案如下。
1)什么是文件?什么是文件系统?
文件是以计算机硬盘为载体的存储在计算机上的信息集合,它的形式多样,可以是文本文档、图片、程序等。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关的软件、被管理文件及实施文件管理所需的数据结构。
2)文件系统要完成哪些功能?
对于用户而言,文件系统最主要的功能是实现对文件的基本操作,让用户可以按名存储和查找文件,组织成合适的结构,并应当具有基本的文件共享和文件保护功能。对于操作系统本身而言,文件系统还需要管理与磁盘的信息交换,完成文件逻辑结构和物理结构上的变换,组织文件在磁盘上的存放,采取好的文件排放顺序和磁盘调度方法以提升整个系统的性能。
学习到这里时,读者应会有这样的一种体会:现代操作系统的管理思想中,到处能够见到面向对象程序设计的影子。本节我们学习的一个新概念————文件,实质上就是一个抽象数据类型,也就是一种 $\color{red}{\text{数据结构}}$ ,若读者在复习操作系统之前已复习完数据结构,则遇到一种新的数据结构时,一定会有这样的意识:要认识它的逻辑结构、物理结构,以及对这种数据结构的操作。本节我们已经学完文件的 $\color{green}{\text{逻辑结构}}$ ,下一节将介绍文件的实现,也就是文件的 $\color{green}{\text{物理结构}}$ 。操作系统对文件的操作不是本课程关心的问题,我们不去研究。
文件系统实现
在学习本节时,请读者思考以下问题:
1)在目录中查找某个文件可以使用什么方法?
2)文件的逻辑结构和物理结构有何区别?单个文件的逻辑结构和物理结构之间是否存在某些制约关系?上节介绍了目录和文件的逻辑结构,本节将介绍文件物理结构和目录的实现。建议读者阅读之前先回顾上节的内容,并自己思考相应功能的实现方法,在学习过程中和本节的方法进行对比,这样能更好地理解本节的内容。
图4.9文件系统层次结构

文件系统层次结构
现代操作系统有多种文件系统类型(如FAT32,NTFS,ext2,ext3,ext4等),因此文件系统的层次结构也不尽相同。图4.9是一种合理的层次结构。
图4.9文件系统层次结构

用户调用接口
文件系统为用户提供与文件及目录有关的调用,如新建、打开、读写、关闭、删除文件,建立、删除目录等。此层由若干程序模块组成,每个模块对应一条系统调用,用户发出系统调用时,控制即转入相应的模块。
文件目录系统
文件目录系统的主要功能是管理文件目录,其任务有管理活跃文件目录表、管理读写状态信息表、管理用户进程的打开文件表、管理与组织存储设备上的文件目录结构、调用下一级存取控制模块。
存取控制验证模块
实现文件保护主要由该级软件完成,它把用户的访问要求与FCB中指示的访问控制权限进行比较,以确认访问的合法性。
逻辑文件系统与文件信息缓冲区
逻辑文件系统与文件信息缓冲区的主要功能是,根据文件的逻辑结构将用户要读写的逻辑记录转换成文件逻辑结构内的相应块号。
物理文件系统
物理文件系统的主要功能是把逻辑记录所在的相对块号转换成实际的物理地址。
辅助分配模块
分配模块的主要功能是管理辅存空间,即负责分配辅存空闲空间和回收辅存空间。
设备管理程序模块
设备管理程序模块的主要功能是分配设备、分配设备读写用缓冲区、磁盘调度、启动设备、处理设备中断、释放设备读写缓冲区、释放设备等。
对于文件管理系统的层次结构我们不能忽略,因为它是重要考点之一,当然也不需要死记硬背,我们可以通过用户请求访问某个文件时发生的一系列事情来辅助记忆文件系统的层次结构。
例如,用户要查看文件F中的内容,对操作系统发出命令(操作系统有面向用户的接口),于是就经过了第О级的用户调用接口。
操作系统得到命令后,需要查找目录以查找文件F的索引信息,可能是FCB,也可能是索引结点,经过了第1级文件目录系统。
通过目录找到文件FCB后,需要查看文件FCB上的信息,看看那个用户有没有访问该文件的权限,于是经过了存取控制验证模块。
用户通过验证后,就真正开始寻址。经历第3章的学习后,我们有这样的意识:操作系统的寻址往往要先得到逻辑地址,再得到物理地址,于是在开始寻址时,操作系统经过逻辑文件系统与文件信息缓冲区,得到了相应文件的内容的逻辑地址。
把 $\color{green}{\text{逻辑地址}}$ 转换为 $\color{green}{\text{物理地址}}$ ,是在 $\color{green}{\text{物理文件系统}}$ 中完成的。
至此为止,寻址就已完成。寻址完成后,我们关心的是找到的这块空间应该如何管理,若要释放这块空间,则任务就交给辅助分配模块,若要把这块空间分配给设备用于输入/输出,则把任务交给设备管理程序模块。
目录实现
在读文件前,必须先打开文件。打开文件时,操作系统利用路径名找到相应目录项,目录项中提供了查找文件磁盘块所需要的信息。目录实现的基本方法有线性列表和哈希表两种,要注意目录的实现就是为了查找,因此线性列表实现对应线性查找,哈希表的实现对应散列查找。
线性列表
最简单的目录实现方法是使用存储文件名和数据块指针的线性表。创建新文件时,必须首先搜索目录表以确定没有同名的文件存在,然后在目录表后增加一个目录项。删除文件则根据给定的文件名搜索目录表,接着释放分配给它的空间。重用目录项有许多方法:可以将目录项标记为不再使用,或将它加到空闲目录项表上,还可以将目录表中的最后一个目录项复制到空闲位置,并降低目录表长度。采用链表结构可以减少删除文件的时间,其优点在于实现简单,不过由于线性表的特殊性,比较费时。
哈希表
哈希表根据文件名得到一个值,并返回一个指向线性列表中元素的指针。这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免冲突。最大的困难是哈希表长度固定以及哈希函数对表长的依赖性。
目录查询是通过在磁盘上反复搜索完成的,需要不断地进行I/O操作,开销较大。所以如前所述,为了减少I/O操作,把当前使用的文件目录复制到内存,以后要使用该文件时只需在内存中操作,因此降低了磁盘操作次数,提高了系统速度。
文件实现—文件分配方式
前面说过,文件实际上是一种抽象数据类型,我们要研究它的逻辑结构、物理结构以及关于它的一系列操作(不是统考关注的内容)。文件的实现就是研究文件的物理结构,即文件数据在物理存储设备上是如何分布和组织的。同一个问题有两个方面的回答:一是文件的分配方式,讲的是对磁盘非空闲块的管理;二是文件存储空间管理,讲的是对磁盘空闲块的管理。
文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。常用的磁盘空间分配方法有三种:连续分配、链接分配和索引分配。有的系统(如RDOS操作系统)对三种方法都支持,但更普遍的是一个系统只支持一种方法。对于本节的内容,读者要注意与文件的逻辑结构区分,从历年的经验来看,这是很多读者容易搞混的地方(读者复习完数据结构后,应该了解 $\color{green}{\text{线性表}}$ 、 $\color{green}{\text{顺序表}}$ 和 $\color{green}{\text{链表之间}}$ 的关系,类比到这里就不易混淆)。
连续分配
连续分配方法要求每个文件在磁盘上占有一组连续的块,如图4.10所示。磁盘地址定义了磁盘上的一个线性排序。这种排序使作业访问磁盘时需要的寻道数和寻道时间最小。
图4.10连续分配

文件的连续分配可以用第一块的磁盘地址和连续块的数量来定义。若文件长 $n$ 块并从位置 $b$ 开始,则该文件将占有块b,b+ 1,b+2,…,b+n-1。一个文件的目录条目包括开始块的地址和该文件所分配区域的长度。
连续分配支持顺序访问和直接访问。其优点是实现简单、存取速度快。缺点是文件长度不宜动态增加,因为一个文件末尾后的盘块可能已分配给其他文件,一旦需要增加,就需要大量移动盘块。此外,反复增删文件后会产生外部碎片(与内存管理分配方式中的碎片相似),且很难确定一个文件需要的空间大小,因而只适用于 $\color{green}{\text{长度固定}}$ 的文件。
链接分配
链接分配采取离散分配的方式,消除了外部碎片,因此显著提高了磁盘空间的利用率;又因为根据文件的当前需求为其分配必需的盘块,当文件动态增长时,可以动态地再为它分配盘块,因此无须事先知道文件的大小。此外,对文件的增、删、改也非常方便。链接分配又可以分为隐式链接和显式链接两种形式。
隐式链接如图4.11所示。每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除最后一个盘块外,每个盘块都有指向下一个盘块的指针,这些指针对用户是透明的。目录包括文件第一块的指针和最后一块的指针。
图4.11隐式链接分配

创建新文件时,目录中增加一个新条目。每个目录项都有一个指向文件首块的指针。该指针初始化为NULL 以表示空文件,大小字段为0。写文件会通过空闲空间管理系统找到空闲块,将该块链接到文件的尾部,以便写入。读文件则通过块到块的指针顺序读块。
$\color{green}{\text{隐式链接}}$ 分配的缺点是无法直接访问盘块,只能通过指针顺序访问文件,且盘块指针会消耗一定的存储空间。隐式链接分配的稳定性也是一个问题,系统在运行过程中由于软件或硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。
$\color{green}{\text{显式链接}}$ 是指把用于链接文件各物理块的指针,从每个物理块的块末尾中提取出来,显式地存放在内存的一张链接表中。该表在整个磁盘中仅设置一张,称为文件分配表(File AllocationTable,FAT)。每个表项中存放对应块的下一块链接指针,即下一个盘块号。文件的第一个盘块号记录在目录中,后续的盘块可通过查FAT找到。例如,某磁盘共有100个磁盘块,存放了两个文件:文件“aa”占三个盘块,依次是2→8→5;文件“bbb”占两个盘块,依次是7→1。其余盘块都是空闲盘块,则该磁盘的FAT表如图4.12所示。
图4.12文件分配表

不难看出,FAT的表项与全部磁盘块一一对应,并且可以用一个特殊的数字-1表示文件的最后一块,用-2表示这个磁盘块是空闲的(当然也可指定为-3,-4)。因此,文件分配表(FAT)不仅记录了文件各块之间的先后链接关系,同时还标记了空闲的磁盘块,操作系统也可以通过FAT对文件存储空间进行管理。当某进程请求操作系统分配一个磁盘块时,操作系统只需从FAT中找到-2的表项,并将对应的磁盘块分配给进程即可。
FAT表在系统启动时就会被读入内存,因此查找FAT的过程是在内存中进行的,因此不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数。
索引分配
链接分配解决了连续分配的外部碎片和文件大小管理的问题。但是,链接分配不能有效支持直接访问(FAT 除外)。索引分配解决了这个问题,它把每个文件的所有的盘块号都集中放在一起构成索引块(表),如图4.13所示。
图4.13 索引分配

每个文件都有其 $\color{green}{\text{索引块}}$ ,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。目录条目包括索引块的地址。要读第 i块,通过索引块的第 i个条目的指针来查找和读入所需的块。
创建文件时,索引块的所有指针都设为空。首次写入第i块时,先从空闲空间中取得一个块,再将其地址写到索引块的第i个条目。索引分配支持直接访问,且没有外部碎片问题。其缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。可以采用以下机制来处理这个问题。
- 链接方案。一个索引块通常为一个磁盘块,因此它本身能直接读写。为了处理大文件,可以将多个索引块链接起来。
- 多层索引。多层索引使第一层索引块指向第二层的索引块,第二层索引块再指向这种方法根据最大文件大小的要求,可以继续到第三层或第四层。例如,4096B 的块,能在索引块中存入1024个4B的指针。两层索引允许1048576个数据块,即允许最大文件为4GB。
- 混合索引。将多种索引分配方式相结合的分配方式。例如,系统既采用直接地址单级索引分配方式或两级索引分配方式(混合索引是本章最综合的高频考点,可先学习本章疑难点4,然后回来接着学习)。
表4.2是三种分配方式的比较。
表4.2文件三种分配方式的比较

此外,访问文件需要两次访问外存——首先要读取索引块的内容,然后访问具体的磁盘块,因而降低了文件的存取速度。为了解决这一-问题,通常将文件的索引块读入内存的缓冲区中,以加快文件的访问速度。
文件实现————文件存储空间管理
(1)文件存储器空间的划分与初始化
一般来说,一个文件存储在一个文件卷中。文件卷可以是物理盘的一部分,也可以是整个物理盘,支持超大型文件的文件卷也可由多个物理盘组成,如图4.14所示。
在一个文件卷中,文件数据信息的空间(文件区)和存放文件控制信息FCB的空间(目录区)是分离的。由于存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的逻辑卷中的文件。逻辑卷在提供文件服务前,必须由对应的文件程序进行初始化,划分好目录区和文件区,建立空闲空间管理表格及存放逻辑卷信息的 $\color{green}{\text{超级块}}$ 。
图4.14逻辑卷与物理盘的关系

(2)文件存储器空间管理
文件存储设备分成许多大小相同的物理块,并以 $\color{green}{\text{块}}$ 为单位交换信息,因此,文件存储设备的管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题。
空闲表法
空闲表法属于连续分配方式,它与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。系统为外存上的所有空闲区建立一张空闲盘块表,每个空闲区对应于一个空闲表项,其中包括表项序号、该空闲区第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列,如表4.3所示。
空闲盘区的分配与内存的动态分配类似,同样采用首次适应算法、循环首次适应算法等。例如,在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲盘块表的各表项,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲盘块表。
系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相邻接者应予以合并。
表4.3空闲盘块表

空闲链表法
将所有空闲盘区拉成一条空闲链,根据构成链所用的基本元素不同,可把链表分成两种形式:空闲盘块链和空闲盘区链。
空闲盘块链将磁盘上的所有空闲空间以盘块为单位拉成–条链。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。这种方法的优点是分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时可能要重复多次操作。
空闲盘区链将磁盘上的所有空闲盘区(每个盘区可包含若干盘块)拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区合并。
位示图法
位示图利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为“0”时,表示对应的盘块空闲;当其值为“1”时,表示对应的盘块已分配。位示图法示意如图4.15所示。
图4.15位示图法示意图

盘块的分配:
${\textstyle\unicode{x2460}}$ 顺序扫描位示图,从中找出一个或一组其值为“0”的二进制位。
②将找到的一个或一组二进制位,转换成与之对应的盘块号。若找到的其值为“0O”的二进制位位于位示图的第 $i$ 行、第 $j$ 列,则其相应的盘块号应按下式计算( $n$ 代表每行的位数):
$$
b= n(i- 1)+j
$$
③修改位示图,令map[ i,j ]= 1。盘块的回收:
①将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为
$$
i=(b -1) DIV n+1
$$
$$
j=(b-1)MOD n+1
$$
②修改位示图,令map[ i,j ]=0。
成组链接法
空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太大。在UNIX系统中采用的是成组链接法,这种方法结合了空闲表和空闲链表两种方法,克服了表太大的缺点。其大致思想是:把顺序的n个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针。假设磁盘最初全为空闲扇区,其成组链接如图4.16所示。通过这种方式可以迅速找到大批空闲块地址。
图4.16成组链接法示意图

表示文件存储器空闲空间的“位向量”表或第一个成组链块,以及卷中的目录区、文件区划分信息都需要存放在辅存储器中,一般放在卷头位置,在UNIX系统中称为超级块。在对卷中的文件进行操作前,超级块需要预先读入系统空闲的主存,并且经常保持主存超级块与辅存卷中超级块的一致性。
注意:本书如无特别提示,所使用的位示图法中行和列都从1开始编号。特别注意,若题目中指明从0开始编号,则上述计算方法要进行相应调整。
本节小结
本节开头提出的问题的参考答案如下。
在目录中查找某个文件可以使用什么方法?
可以采用线性列表法或哈希表法。线性列表把文件名组织成一个线性表,查找时依次与线性表中的每个表项进行比较。若把文件名按序排列,则使用折半查找法可以降低平均的查找时间,但建立新文件时会增加维护线性表的开销。哈希表用文件名通过哈希函数得到一个指向文件的指针,这种方法非常迅速,但要注意避免冲突。
文件的逻辑结构和物理结构有何区别?单个文件的逻辑结构和物理结构之间是否存在着某些制约关系?
文件的逻辑结构是用户可见的结构,即用户使用文件的结构。文件的物理结构是文件在存储器上的组织结构,它表示一个文件在辅存上安置、链接、编目的方法。它和文件的存取方法以及辅存设备的特性等都有着密切的联系。单个文件的逻辑结构和物理结构之间虽无明显的制约或关联关系,但是如果物理结构选择不慎,也很难体现出逻辑结构的特点,比如一个逻辑结构是顺序结构,而物理结构是隐式链接结构的文件,即使理论上可以很快找出某条记录的地址,而实际找时仍然需要在磁盘上一块一块地找。
磁盘组织与管理
在学习本节时,请读者思考以下问题:
1)在磁盘上进行一次读写操作需要哪几部分时间?其中哪部分时间最长?
2)存储一个文件时,当一个磁道存储不下时,剩下部分是存在同一个盘面的不同磁道好,还是存在同一个柱面上的不同盘面好?
本节主要介绍文件系统管理磁盘的方式,由于内容较少且属于实现部分,不需要问题来引导学习,因此本节不给出问题。学习本节时,要重点掌握计算一次磁盘操作的时间,以及对于给定访盘的磁道序列,按照特定算法求出磁头通过的总磁道数及平均寻道数。
磁盘的结构
磁盘(Disk)是由表面涂有磁性物质的金属或塑料构成的圆形盘片,通过一个称为磁头的导体线圈从磁盘存取数据。在读/写操作期间,磁头固定,磁盘在下面高速旋转。如图4.17所示,磁盘盘面上的数据存储在一组同心圆中,称为 $\color{green}{\text{磁道}}$ 。每个磁道与磁头一样宽,一个盘面有上千个磁道。磁道又划分为几百个扇区,每个扇区固定存储大小(通常为512B),一个 $\color{green}{\text{扇区}}$ 称为一个 $\color{green}{\text{盘块}}$ 。相邻磁道及相邻扇区间通过一定的间隙分隔开,以避免精度错误。注意,由于扇区按固定圆心角度划分,所以密度从最外道向里道增加,磁盘的存储能力受限于最内道的最大记录密度。
磁盘安装在一个磁盘驱动器中,它由磁头臂、用于旋转磁盘的主轴和用于数据输入/输出的电子设备组成。如图4.18所示,多个盘片垂直堆叠,组成 $\color{green}{\text{磁盘组}}$ ,每个盘面对应一个磁头,所有磁头固定在一起,与磁盘中心的距离相同且一起移动。所有盘片上相对位置相同的磁道组成柱面。按照这种物理结构组织,扇区就是磁盘可寻址的最小存储单位,磁盘地址用“柱面号·盘面号·扇区号(或块号)”表示。
图4.17磁盘盘片 图4.18 磁盘驱动器

磁盘按不同的方式可分为若干类型:磁头相对于盘片的径向方向固定的,称为固定头磁盘,每个磁道一个磁头;磁头可移动的,称为活动头磁盘,磁头臂可来回伸缩定位磁道;磁盘永久固定在磁盘驱动器内的,称为固定盘磁盘;可移动和替换的,称为可换盘磁盘。
前面说过,操作系统中几乎每介绍一类资源及对这类资源的管理时,都要涉及一类调度算法。用户访问文件,需要操作系统的服务,文件实际上存储在磁盘中,操作系统接收用户的命令后,经过一系列的检验访问权限和寻址过程后,最终都会到达磁盘,控制磁盘把相应的数据信恳读出或修改。当有多个请求同时到达时,操作系统就要决定先为哪个请求服务,这就是磁盘调度算法
要解决的问题。
磁盘调度算法
一次磁盘读写操作的时间由寻找(寻道)时间、旋转延迟时间和传输时间决定。
1)寻找时间 $T_s$ ,。活动头磁盘在读写信息前,将磁头移动到指定磁道所需要的时间。这个时间除跨越 $n$ 条磁道的时间外,还包括启动磁臂的时间 $s$ ,即
$$
T_s = m \times n + s
$$
式中,m是与磁盘驱动器速度有关的常数,约为0.2ms,磁臂的启动时间约为2ms。
2)旋转延迟时间 $T_s$ 。磁头 $\color{green}{\text{定位}}$ 到某一磁道的扇区所需要的时间,设磁盘的旋转速度为 $r$ ,则
$$
T_r = \dfrac{1}{2r}
$$
对于硬盘,典型的旋转速度为5400转/分,相当于一周11.1ms,则 $T_r$ 为5.55ms;对于软盘,其旋转速度为300~600转/分,则 $T_r$ 为50~100ms。
3)传输时间 $T_t$ 。从磁盘读出或向磁盘写入数据所经历的时间,这个时间取决于每次所读/写的字节数 $b$ 和磁盘的旋转速度:
$$
T_t = \dfrac{b}{rN}
$$
式中, $r$ 为磁盘每秒的转数, $N$ 为一个磁道上的字节数。
在磁盘存取时间的计算中,寻道时间与磁盘调度算法相关,下面将会介绍分析几种算法;而延迟时间和传输时间都与磁盘旋转速度相关,且为 $\color{green}{\text{线性相关}}$ ,所以在硬件上,转速是磁盘性能的一个非常重要的参数。
总平均存取时间 $T_a$ 可以表示为
$$
T_a = T_s + \dfrac{1}{2r} + \dfrac{b}{rN}
$$
虽然这里给出了总平均存取时间的公式,但是这个平均值是没有太大实际意义的,因为在实际的磁盘IO操作中,存取时间与磁盘调度算法密切相关。调度算法直接决定寻找时间从而决定总的存取时间。
目前常用的磁盘调度算法有以下几种。
先来先服务(First Come First Served,FCFS)算法
FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法,如图4.19所示。该算法的优点是具有公平性。若只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;若有大量进程竞争使用磁盘,则这种算法在性能上往往接近于随机调度。所以,实际磁盘调度中会考虑一些更为复杂的调度算法。
图4.19 FCFS磁盘调度算法

例如,磁盘请求队列中的请求顺序分别为55,58,39,18,90,160,150,38,184,磁头的初始位置是磁道100,采用FCFS算法时磁头的运动过程如图4.19所示。磁头共移动了(45+3+19+21+72+70+10+112+146)= 498个磁道,平均寻找长度=498/9=55.3。
最短寻找时间优先( Shortest Seek Time First, SSTF)算法
SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以便使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但能提供比 FCFS算法更好的性能。这种算法会产生“饥饿”现象。如图4.20所示,若某时刻磁头正在18号磁道,而在18号磁道附近频繁地增加新的请求,则SSTF 算法使得磁头长时间在18号磁道附近工作,将使184号磁道的访问被无限期地延迟,即被“饿死”。
4.20 SSTF磁盘调度算法

例如,磁盘请求队列中的请求顺序分别为55,58,39,18,90,160,150,38,184,磁头初始位置是磁道100,采用SSTF算法时磁头的运动过程如图4.20所示。磁头共移动了10+32+3+16+1+ 20+132+10+24= 248个磁道,平均寻找长度=248/9 = 27.5。
扫描(SCAN)算法(又称电梯调度算法)
- scan求移动的磁道数的快速方法:找到「 $\color{green}{\text{枢纽}}$ 」,两边减去枢纽
SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,实际上就是在最短寻找时间优先算法的基础上规定了磁头运动的方向,如图4.21所示。由于磁头移动规律与电梯运行相似,因此又称电梯调度算法。SCAN算法对最近扫描过的区域不公平,因此它在访问局部性方面不如 FCFS 算法和SSTF算法好。
图4.21SCAN磁盘调度算法

例如,磁盘请求队列中的请求顺序分别为55,58, 39,18,90,160,150,38,184,磁头初始位置是磁道100。采用SCAN算法时,不但要知道磁头的当前位置,而且要知道磁头的移动方向,假设磁头沿磁道号增大的顺序移动,则磁头的运动过程如图4.21所示。移动磁道的顺序为100,150,160,184,200,90,58,55,39,38,18。磁头共移动了(50+10+24+16+110+32+3+16+1+20)=282个磁道,平均寻道长度=282/9= 31.33。
循环扫描( Circular SCAN, C-SCAN)算法
在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。由于SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,所以使用改进型的C-SCAN 算法来避免这个问题,如图4.22所示。
采用SCAN算法和C-SCAN 算法时,磁头总是严格地遵循从盘面的一端到另一端,显然,在实际使用时还可以改进,即磁头移动只需要到达最远端的一个请求即可返回,不需要到达磁盘端点。这种形式的SCAN算法和C-SCAN算法称为LOOK调度(见图4.23-1)和C-LOOK(见图4.23-2)调度,因为它们在朝一个给定方向移动前会查看是否有请求。
4.22 C-SCAN磁盘调度算法

4.23-1 LOOK磁盘调度算法

注意,若无特别说明,也可以默认SCAN算法和C-SCAN算法为LOOK和C-LOOK调度(请读者认真领悟,并通过结合后面的习题进一步加深对以上相关算法的理解)。
4.23-2C-LOOK磁盘调度算法

例如,磁盘请求队列中的请求顺序为55,58,39,18,90,160,150,38,184,磁头初始位置是磁道100。采用C-SCAN算法时,假设磁头沿磁道号增大的顺序移动,则磁头的运动过程如图4.23所示。移动磁道的顺序为100,150,160,184,200,0,18,38,39,55,58,90。磁头共移动50+10+24+16+200+ 18+20+1+16+3+32=390个磁道,平均寻道长度=390/9= 43.33。
不太熟悉操作系统整体框架的读者经常混淆磁盘调度算法中的循环扫描算法和页面调度算法中的CLOCK算法,请读者注意区分。
对比以上几种磁盘调度算法,FCFS 算法太过简单, $\color{green}{\text{性能较差}}$ ,仅在请求队列长度接近于1时才较为理想;SSTF 算法较为通用和自然;SCAN算法和C-SCAN算法在磁盘 $\color{green}{\text{负载较大}}$ 时比较占优势。它们之间的比较见表4.4。
表4.4磁盘调度算法比较

除减少寻找时间外,减少延迟时间也是提高磁盘传输效率的重要因素。可以对盘面扇区进行交替编号,对磁盘片组中的不同盘面错位命名。假设每个盘面有8个扇区,磁盘片组共8个盘面,则可以采用如图4.24所示的编号。
磁盘是连续自转设备,磁头读/写一个物理块后,需要经过短暂的处理时间才能开始读/马下一块。假设逻辑记录数据连续存放在磁盘空间中,若在盘面上按扇区交替编号连续存放,则连续读/写多条记录时能减少磁头的延迟时间;同柱面不同盘面的扇区若能错位编号,连续读/写相邻两个盘面的逻辑记录时也能减少磁头延迟时间。
图4.24 磁盘片组扇区编号

以图4.24为例,在随机扇区访问情况下,定位磁道中的一个扇区平均需要转过4个扇区,这时,延迟时间是传输时间的4倍,这是一种非常低效的存取方式。理想化的情况是不需要定位而直接连续读取扇区,没有延迟时间,这样磁盘数据存取效率可以成倍提高。但由于读取扇区的顺序是不可预测的,所以延迟时间不可避免。图4.24中的编号方式是读取连续编号扇区时的一种方法。
磁盘寻块时间分为三个部分,即寻道时间、延迟时间和传输时间,寻道时间和延迟时间属于“找”的时间,凡是“找”的时间都可以通过一定的方法削减,但传输时间是磁盘本身性质所决定的,不能通过一定的措施减少。
磁盘的管理
磁盘初始化
一个新的磁盘只是一个含有磁性记录材料的空白盘。在磁盘能存储数据之前,它必须分成扇区以便磁盘控制器能进行读和写操作,这个过程称为 $\color{green}{\text{低级格式化}}$ (物理分区)。低级格式化为磁盘的每个扇区采用特别的数据结构。每个扇区的数据结构通常由 $\color{green}{\text{头}}$ 、 $\color{green}{\text{数据区域}}$ (通常为512B大小)和 $\color{green}{\text{尾部}}$ 组成。头部和尾部包含了一些磁盘控制器所使用的信息。
为了使用磁盘存储文件,操作系统还需要将自己的数据结构记录在磁盘上:第一步将磁盘分为由一个或多个柱面组成的 $\color{green}{\text{分区}}$ (即我们熟悉的C盘、D盘等形式的分区);第二步对物理分区进行 $\color{green}{\text{逻辑格式化}}$ (创建文件系统),操作系统将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲和已分配的空间及一个初始为空的目录。
引导块
计算机启动时需要运行一个初始化程序( $\color{green}{\text{自举程序}}$ ),它初始化CPU、寄存器、设备控制器和内存等,接着启动操作系统。为此,该自举程序应找到磁盘上的操作系统内核,装入内存,并转到起始地址,从而开始操作系统的运行。
自举程序通常保存在ROM 中,为了避免改变自举代码而需要改变ROM硬件的问题,因此只在ROM中保留很小的自举装入程序,将完整功能的自举程序保存在磁盘的启动块上,启动块位于磁盘的固定位。拥有启动分区的磁盘称为启动磁盘或系统磁盘。
坏块
由于磁盘有移动部件且容错能力弱,因此容易导致一个或多个扇区损坏。部分磁盘甚至从出厂时就有坏扇区。根据所使用的磁盘和控制器,对这些块有多种处理方式。
对于简单磁盘,如电子集成驱动器(IDE),坏扇区可手工处理,如 MS-DOS的Format 命令执行逻辑格式化时便会扫描磁盘以检查坏扇区。坏扇区在FAT表上会标明,因此程序不会使用。
对于复杂的磁盘,如小型计算机系统接口(SCSI),其控制器维护一个磁盘坏块链表该链表在出厂前进行低级格式化时就已初始化,并在磁盘的整个使用过程中不断更新。低级格式化将一些块保留作为备用,对操作系统透明。控制器可用备用块来逻辑地替代坏块,这种方案称为 $\color{green}{\text{扇区备用}}$ 。
对坏块的处理实质上就是用某种机制,使系统不去使用坏块。坏块属于硬件故障,操作系统是不能修复坏块的。
本节小结
本节开头提出的问题的参考答案如下。
在磁盘上进行一次读写操作需要哪几部分时间?其中哪部分时间最长?
在磁盘上进行一次读写操作花费的时间由寻道时间、延迟时间和传输时间决定。其中寻道时间是将磁头移动到指定磁道所需要的时间,延迟时间是磁头定位到某一磁道的扇区(块号)所需要的时间,传输时间是从磁盘读出或向磁盘写入数据所经历的时间。一般来说, $\color{green}{\text{寻道时间}}$ 因为要移动磁臂,所以占用时间最长。
存储一个文件时,当一个磁道存储不下时,剩下部分是存在同一个盘面的不同磁道好,还是存在同一个柱面上的不同盘面好?
上一问已经说到,寻道时间对于一次磁盘访问的影响是最大的,若存在同一个盘面的不同磁道,则磁臂势必要移动,这样会大大增加文件的访问时间,而存在同一个柱面上的不同盘面就不需要移动磁道,所以一般情况下存在同一个柱面上的不同盘面更好。
本章疑难点
磁盘结构
引导控制块(Boot Control Block)包括系统从该分区引导操作系统所需要的信息。若磁盘没有操作系统,则这块的内容为空。它通常为分区的第一块。UFS称为引导块(Boot Block);NTFS称为分区引导扇区(Partition Boot Sector)。
分区控制块(Partition Control Block)包括分区详细信息,如分区的块数、块的大小、空闲块的数量和指针、空闲FCB 的数量和指针等。UFS称为超级块(Super Block),而NTFS称为主控文件表(Master File Table)。
内存结构
内存分区表包含所有安装分区的信息。
内存目录结构用来保存近来访问过的目录信息。对安装分区的目录,可以包括一个指向分区表的指针。
系统范围的打开文件表,包括每个打开文件的FCB复制和其他信息。
单个进程的打开文件表,包括一个指向系统范围内已打开文件表中合适条目和其他信息的指针。
文件系统实现概述
为了创建一个文件,应用程序调用逻辑文件系统。逻辑文件系统知道目录结构形式,它将为文件分配一个新的 FCB,把相应目录读入内存,用新的文件名更新该目录和FCB,并将结果写回磁盘。图4.25显示了一个典型的FCB。
图4.25典型的FCB

一旦文件被创建,它就能用于IO,不过首先要打开文件。调用open将文件名传给文件系统,文件系统根据给定文件名搜索目录结构。部分目录结构通常缓存在内存中以加快目录操作。找到文件后,其FCB复制到系统范围的打开文件表。该表不但存储FCB,而且存储打开该文件的进程数量的条目。
然后,单个进程的打开文件表中会增加一个条目,并通过指针将系统范围的打开文件表的条目与其他域(文件当前位置的指针和文件打开模式等)相连。调用open返回的是一个指向单个进程的打开文件表中合适条目的指针,所以文件操作都是通过该指针进行的。
文件名不必是打开文件表的一部分,因为一旦完成对FCB在磁盘上的定位,系统就不再使用文件名。对于访问打开文件表的索引,UNIX称之为文件描述符(File Descriptor),而Windows2000称之为文件句柄(Fiie Handle)。因此,只要文件未被关闭,所有文件操作就通过打开文件表来进行。
当一个进程关闭文件时,就会删除单个进程打开文件表中的一个相应条目,即目录项,系统范围内打开文件表的打开数也会递减。当打开文件的所有用户都关闭了一个文件时,更新的文件信息会复制到磁盘的目录结构中,系统范围的打开文件表的条目也将删除。
在实际中,系统调用open 时会首先搜索系统范围的打开文件表,以确定某文件是否已被其他进程所使用。如果是,就在单个进程的打开文件表中创建一项,并指向现有系统范围的打开文件表的相应条目。该算法在文件已打开时,能节省大量开销。
混合索引分配的实现
混合索引分配已在UNIX系统中采用。在UNIX System V的索引结点中,共设置了13个地址项,即 iaddr(0)~iaddr(12),如图4.26所示。在BSD UNIX 的索引结点中,共设置了13个地址项,它们都把所有的地址项分成两类,即直接地址和间接地址。
(1)直接地址
为了提高对文件的检索速度,在索引结点中可设置10个直接地址项,即用iaddr(O)一iaddr(9)来存放直接地址。换言之,这里每项中所存放的是该文件数据所在盘块的盘块号。假如每个盘块的大小为4KB,当文件不大于40KB时,便可直接从索引结点中读出该文件的全部盘块号。
(2)一次间接地址
对于大、中型文件,只采用直接地址并不现实。可再利用索引结点中的地址项iaddr(10)来提供一次间接地址。这种方式的实质就是一级索引分配方式。图中的一次间址块也就是索引块,系统将分配给文件的多个盘块号记入其中。在一次间址块中可存放1024个盘块号,因而允许文件长达 4MB。
(3)多次间接地址
当文件长度大于4MB+40KB(一次间接地址与10个直接地址项)时,系统还须采用二次间接地址分配方式。这时,用地址项iaddr(11)提供二次间接地址。该方式的实质是两级索引分配方式。系统此时在二次间接地址块中记入所有一次间接地址块的盘号。在采用二次间接地址方式时,文件的最大长度可达4GB。同理,地址项iaddr(12)作为三次间接地址,其允许的文件最大长度可达4TB。
4.26UNIX系统的inode结构示意图

最后,我们对本章内容再进行一次宏观上的把握。贯穿本章内容的有两条主线:第一条主线是介绍一种新的抽象数据类型、文件,从逻辑结构和物理结构两个方面进行;第二条主线是操作系统是如何管理“文件”这种数据结构的,介绍了多文件的逻辑结构的组织,即目录,还介绍了如何处理用户对文件的服务请求,即磁盘管理。但宏观认识是远远不够的,从宏观上把握知识的目的是从微观上更加准确地掌控细微知识点,在考试中得到好成绩。读者要通过反复做题、对答案,不断加深自己对知识点的认知程度。


